JVM:运行时数据区

本文详细介绍了Java虚拟机的内存结构,包括程序计数器、栈、本地方法栈、堆、元空间以及运行时常量池。分析了各区域的作用、异常情况以及相关参数设置,强调了内存溢出和栈溢出的分析与解决方案。此外,还讨论了栈、堆和元空间之间的交互。
摘要由CSDN通过智能技术生成

前言

本文基于JDK8和HotSpot虚拟机。

模型图

以JDK8以后的模型图为例,其中元空间和堆是线程共享的,栈、本地方法栈和程序计数器是线程隔离的。

jdk6及以上
在这里插入图片描述
jdk7
在这里插入图片描述
jdk8及以下
在这里插入图片描述

程序计数器

程序计数器是当前线程执行字节码指令的行号指示器,字节码解释器通过改变这个行号指示器的值来读取下一条要执行的字节码指令。由于JVM多线程是通过轮流分配处理器的执行时间来实现的,所以在任何一个确定的时刻一个处理器都只会处理一个线程,.因此为了线程切换后能恢复到正确的执行位置,每个线程都要有一个独立的程序计数器来记录线程切换前的位置。如果线程正在执行的是一个java方法,那么这个计数器记录的是正在执行的字节码的地址,如果线程正在执行的是一个本地方法,那么这个计数器的值将为空。

栈和本地方法栈

栈是以栈帧为单位保存运行时数据的内存区域,每个方法在执行的时候JVM都会同步创建一个栈帧压入栈,当该方法执行结束时该栈帧就会出栈。一个方法调用到执行结束的过程就对应着栈帧出栈入栈的过程。本地方法栈和栈的性质基本相同,唯一的区别在于本地方法栈为JVM调用本地方法服务。
在这里插入图片描述

栈帧

在这里插入图片描述

局部变量表

局部变量表是一个以变量槽为存储单位的空间,用于存储方法中各种编译期已知的基本数据类型和对象引用类型的方法参数和方法内部定义的局部变量,其中只有64位的longdouble会占用两个变量槽,其它类型只占一个。局部变量表的大小在编译期间就已经确定了,在方法运行期间不会改变局部变量表的大小。JVM通过索引定位的方式使用局部变量表,如果当前方法不是静态方法,那么局部变量表的第一个变量槽将是一个指向thisreference。其余方法参数则按照参数列表顺序排列,参数列表分配完成后,再根据方法体内定义的局部变量顺序和作用域分配其余的变量槽。

操作数栈

操作数栈的主要作用是作为执行引擎的工作空间,用于存储计算过程中的中间结果。

动态链接

动态链接指向运行时常量池中的当前栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接。

异常分析

如果线程请求的栈深度大于JVM所允许的最大深度,将出现StackOverflow异常。如果创建线程数过多会出现OutOfMemory异常,此时应该减小栈空间大小而获得更多的线程数。

参数设置

参数说明
-Xss设置栈空间大小

几乎所有的对象都存放在堆中,它是垃圾回收器管理的内存区域,为了更快的进行垃圾回收,不同的垃圾收集器将堆换分为不同的区域,但大部分划分方式都包括以下逻辑区域,这些区域在物理上可能并不是连续的。
在这里插入图片描述
它被所有线程共享,这些线程可以在堆中划分出多个线程私有的分配缓冲区(TLAB),这样既能避免一系列的线程安全问题,还能提升内存分配的吞吐量。

异常分析

HotSpot堆空间是可以动态扩展的,当出现无法为对象分配空间或无法扩展时会出现OutOfMemory异常。要解决这个异常第一部应该确认导致OOM的原因是因为内存泄漏还是因为内存溢出。如果是内存泄漏,可以进一步通过工具查看内存泄露对象到GCRoots的引用链,进而找出产生内存泄露代码的具体位置。如果是内存溢出换句话说就是内存中的对象都需要存活,那么就需要修改JVM参数或修改代码结构解决问题。

参数设置

参数说明
-XX:+PrintFlogsInitial打印参数的默认初始值
-XX:+PrintFlagFinal打印参数的最终值
-Xms堆内存最小值
-Xmx堆内存最大值
-Xmn设置新生区大小
-XX:NewRatio配置新生区和老年区的占比
-XX:SurvivorRatio设置新生区Eden的占比
-XX:MaxTenuringThreshold设置新生代垃圾的最大年龄
-XX:+PrintGCDetails输出详细的GC处理日志
-XX:HandlePromotionFailure是否设置空间分配担保

元空间

元空间是分配在直接内存的一块空间,它用于存储已被JVM加载的类型信息、常量和即时编译器编译后的代码等数据。该区域也会被垃圾收集器管理,主要进行一些类型的卸载和废弃常量的回收。
在这里插入图片描述

运行时常量池

字节码文件中用于存放编译期生成的各种字面量和符号引用的常量池表将在类加载后存放到元空间中的运行时常量池中,同时也会把符号引用翻译出来的直接引用也保存在运行时常量池中。

异常分析

元空间无法满足内存分配要求时会出现OutOfMemory异常。

参数设置

参数说明
-XX:MetaspaceSize设置元空间初始大小,单位为字节,垃圾收集器会智能调节该值
-XX:MaxMetaspaceSize设置元空间最大值,-1为无上限
-XX:MinMetaspaceFreeRatio设置垃圾收集之后最小元空间剩余量的百分比
-XX:Max-MetaspaceFreeRatio设置垃圾收集之后最大元空间剩余量的百分比
-XX:MaxDirectMemory设置直接内存的最大值,如果不设置则默认与堆的大小一样

栈、堆和元空间的交互

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亻乍屯页女子白勺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值