【Java面试】说说JVM的内存结构以及他们那些会产生内存溢出?

news2024/10/6 0:34:02

文章目录

  • 内存结构
  • 内存溢出的产生

内存结构

在这里插入图片描述
在这里插入图片描述

对于JVM的内存结构,我将按照上面两张图配合来讲。

Java Source就是我们的Java源代码,经过JVM编译器编译之后变为Java Class也称Java字节码文件。当我们运行java命令对字节码文件进行运行的时候,将会创建一个Java虚拟机。
此时虚拟机将会创建一个名字为main的主线程来执行我们的入口方法的代码,也就是它会去找main方法。
而运行代码也是需要内存的,而他的内存从JVM Stacks虚拟机栈中获取,当然不光光是主线程,还有我们在代码中new Thread的线程也是从这里获取内存资源。
当然,想要运行main方法,会发现main方法是在一个类Main中的,而此时还没有加载这个类呢,因此我们需要对这个类进行加载,此时就会通过类加载子系统将类的原始信息加载到Method Area方法区中,加载到这个区中的信息包括类的名字,类的继承关系,类的成员变量,类中引用的其他类,以及类的方法代码等。
而当我们的方法执行到一个new操作的时候,也就是需要创建一个实例对象的时候,对象所占用的内存来自于堆Heap,会先计算这个对象需要占用多大的内存,然后去堆中找到一个这么大的内存来创建这个对象。
而指向这个对象的引用,以及方法参数,他们都是引用值,他们就不是放在堆中了,而是放在虚拟机栈JVM Stacks中。
而当调用update这种我们自己编写的方法,或者调用hashCode这种Java无法实现,必须依靠底层操作系统来实现的代码,我们都放在JVM Stacks中,当然hashCode这种方法一般是放在Native Method Stacks本地方法栈中,不过我们JVM的实现是直接将他们整合在JVM Stacks中了。
而当前线程他不可能一直占用CPU,那么当他交出CPU的使用权的时候,下一次再次轮到它之后如何直到要从哪里开始呢?
这个时候就用到了PC Register,程序计数器,他将会当前这个线程运行到的代码的位置,因此即使当前线程被切换了,那么下次切换回来的时候通过程序计数器也能直到该从哪里继续运行。
那么当我们的对象被设定为null,或者没有引用的时候,那么我们的GC垃圾回收器将会对这些对象进行回收。
同时,我们的CPU其实是不能理解字节码指令的,因此我们还需要JVM提供的解释器对字节码指令进行解释,将其翻译成CPU可以理解的机器码指令,当然对于重复的代码也是重复进行解释的。
而对于一些频繁调用的热点代码,如执行万次的循环,那么就会通过JIT进行优化,加快这些热点代码的执行,从而提高效率。

内存溢出的产生

上面的结构中,除了程序计数器不会发生内存溢出,其他的都会发生内存溢出。

出现 OutOfMemoryError的情况

  • 堆内存耗尽–对象越来越多,又一直在使用,不能被垃圾回收
  • 方法区内存耗尽–加载的类越来越多,很多框架都会在运行期间动态产生新的类
  • 虚拟机栈累积–每个线程最多会占用1M内存,线程个数越来越多,而又长时间运行不销毁时出现

StackOverflowError的区域

  • 虚拟机栈内部–方法调用次数过多,每一次调用方法都会从线程分配到的内存中拿走一点去做函数调用,如果调用太多,那么内存不够了,就会溢出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78269.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习-三维卷积神经网络(3DCNN)

1. 3DCNN理解 2D卷积仅仅考虑2D图片的空间信息,所以只适用于单张2D图片的视觉理解任务。在处理3D图像或视频时,网络的输入多了一个维度,输入由(c,height,width)(c,height,width)(c,height,width)变为了(c,depth,height,width)(c,depth,height…

计算机毕业设计django基于python学生考试成绩数据分析与可视化系统

项目介绍 随着社会的逐步发展,计算机网络技术对人们工作、生活影响是全面且深入的。基于计算机网络的管理系统越来越受到人们的欢迎,人们可以通过基于网络的管理系统进行实时数据信息查询、管理数据信息等,给人们的生活、工作带来便利。 在学校的日常管理工作中,学生成绩的统计…

【Python计算机视觉】项目实战之图像增强imguag对关键点变换、标注框变化(附源码 超详细必看)

需要源码或运行有问题请点赞关注收藏后评论区留言私信~~~ 一、imgaug简介 imguag使一个用于机器学习实验中图像增强的Python依赖库,支持Python2.7和Python3.4以上的版本,它支持多种图像增强技术,并允许轻松地组合这些技术,具有简…

uniapp中如何使用vuex进行状态管理(登录小案例讲解)

前言 本篇文章来讲解uniapp中如何使用vuex来实现状态管理,后面会讲实现登录状态管理的案例。如果之前学过vuex全家桶的同学那应该没啥问题,在uniapp中使用vuex和vue中基本是一样的。 什么是vuex 简单来说就是vue中的状态管理仓库,对于vuex…

从文件包含到RCE方法

前言 大家在参加众测的行动时,若是发现了以下基础危害不大的漏洞,不建议直接提交的,而是应该想办法看,能不能对该漏洞进行升级,扩大其危害,多拿点奖励。当然,文件包含不算常见,经常…

车床零件加工调度问题

目录 题目 思路 代码 运行结果 题目 某车间需要用一台车床和一台加工A,B,C,D4个零件。每个零件都需要先用车床加工,再用加工。车床和加工每个零件所需的工时(包括加工前的准备时间以及加工后的处理时间)如下表所示。…

移动端APP测试常见面试题精析

现在面试测试职位,要求非常全面,那么APP测试一般需要哪些技术呢?下面总结了APP测试常见面试题: 1.Android四大组件? Activity:描述UI,并且处理用户与机器屏幕的交互。应用程序中,一个Activity就相当于手…

c++ 基础(新手入门必看)

C基础讲解,用于C语言向C的衔接 文章目录命名空间C输入输出缺省参数函数重载引用内联函数auto关键字基于范围for循环指针空值 -- nullptr命名空间 如果你以前看到过C的程序,那么你大概率会看到这样一行代码 这行代码就用到了命名空间的知识,…

QT 系统学习 day06 ,摄像头,语音识别(语音转文字,文字转语音,Qt 的人脸识别系统),

1.调用摄像头&#xff0c;拍照&#xff0c;存储照片 1.摄像头文件 /******* 摄像头相关类 *****/ #include <QCamera> /*** 摄像头类 ***/ #include <QCameraInfo> /*** 系统摄像头属性类 ***/ #include <QCameraImageCapture> /*** 用于记录摄像头数据的类…

C语言入门(一)——程序的基本概念

程序的基本概念 程序和编程语言 自然语言和形式语言 程序的调试 第一个程序 程序的基本概念 程序和编程语言 1.程序 程序&#xff08;Program&#xff09;告诉计算机应如何完成一个计算任务&#xff0c;这里的计算可以是数学运算&#xff0c;比如解方 程&#xff0c;也可…

Centos7下安装PostgreSQL14及其基本命令使用

MySQL关系型数据库目前算是互联网公司使用最多的。前两天看到一个推文&#xff0c;相对比国内使用MySQL&#xff0c;PostgreSQL在国内的普及貌似不高&#xff1f;国外像网络电话公司Skype公司等在大量使用PostgreSQL 作为互联网从业者&#xff0c;保持学习是必须的。开始学习Po…

小甲鱼C语言【课后笔记第一章——打印(printf)

目录 1、“打印”就是“输出”的意思 2、使用 GCC 编译程序&#xff1a;gcc 源代码 -o 可执行文件。 3、printf 是格式化输出函数 a、函数概要 b、函数原型 c、参数分析 d、返回值 e、演示 4. 转义字符 5. 反斜杠的奥义 6、课后习题&#xff08;编程题&#xff09; 1、…

性能工具之JMeter模拟多IP地址访问

文章目录一、前言二、前置条件三、操作步骤一、前言 今天一同事在压测时提到怎么用 JMeter 里虚拟多个 IP 来发送请求&#xff0c;我想了一下以前用LR时用过虚拟ip地址&#xff0c;JMeter 还没有使用过。想着原理应该是相通的&#xff0c;既然 LR 都能支持的话&#xff0c;那 …

多线程学习笔记(四)-- 常见类及使用

1. thread的方法 Thread.sleep()&#xff1a;占用cpu资源 Thread.yeild()&#xff1a;当前线程让渡cpu资源&#xff0c;大家竞争&#xff0c;也有再抢到cpu的机会 t1.join()&#xff1a;在t2线程中&#xff0c;调用t1.join()&#xff0c;是等待t1执行完成 2. 线程状态 3. sy…

力扣(LeetCode)142. 环形链表 II(C++)

哈希表 最直观的思想&#xff0c;哈希表记录遍历的结点&#xff0c;如果结点重复出现&#xff0c;则有环。如果遍历到空结点&#xff0c;无环。 class Solution { public:ListNode *detectCycle(ListNode *head) {unordered_set<ListNode *> ad;auto tail head;while(…

java计算机毕业设计ssm医患交流平台93xzr(附源码、数据库)

java计算机毕业设计ssm医患交流平台93xzr&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

用Excel自带图表插入带分类变量的箱形图(单坐标轴并列箱)

箱型图主要用来观察一个或多个类别下&#xff0c;数值型变量的分位数及离群值的特征和分布&#xff0c;以及在一定程度上观察到偏度和峰度的状态。网上有一些自己计算分位数来绘制箱型图的方法&#xff0c;但一方面是没有直接使用excel自带的箱型图好看和功能全面&#xff0c;二…

qq群聊机器人接入ChatGPT-简介和源码

qq群聊机器人接入ChatGPT 最近 ChatGPT 很火&#xff0c;也注册了账号玩了玩&#xff0c;确实灰常强大。但是也有的小伙伴可能没办法注册账号&#xff0c;我就想着把qq群机器人接入ChatGPT。 过程还是比较简单顺利的。下面简单介绍一下 直接跳过介绍&#xff0c;查项目代码 1…

绘制金字塔-第10届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第100讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

基于java(springboot)校园新闻管理系统源码(java毕业设计)

基于java(springboot)校园新闻管理系统 校园新闻管理系统是基于java编程语言&#xff0c;MySQL数据库&#xff0c;和springboot框架&#xff0c;用idea开发工具开发的设计&#xff0c;本设计分为学生用户&#xff0c;管理员两个角色&#xff0c; 学生的主要功能是可以注册登陆…