JVM内存模型
2024-06-16 10:13:51 0 举报
JVM内存模型
作者其他创作
大纲/内容
运行时常量池
局部变量表
Test.java
局部变量表是一组变量值存储空间,用于存放方法参数和方法内定义的局部变量。局部变量表的容量以变量槽为最小单位,Java虚拟机规范并没有定义一个槽所应该占用内存空间的大小,但是规定了一个槽应该可以存放一个32位以内的数据类型,其中64位长度的long和double数据会占用两个变量槽。如果是类类型的变量,则会在局部变量表中保存一个指向JVM堆中对象的引用
方法区
线程共享的
类加载的生命周期:1、加载阶段:二进制的class字节流就按照JVM所需要的格式存储在方法区内;2、验证阶段:输入的字节流不符合Class文件格式的约束,可能会出现java.lang.NoSuchMethodError等异常;3、准备阶段:static修饰的变量赋值为零值,常量赋值为常量值4、解析阶段:将JVM将常量池内的符号引用替换为直接引用(直接指定物理地址)5、初始化阶段:执行静态语句块(static{})和赋值
编译javac
返回地址
程序计数器
运行时常量池:存放编译器生成的各种字面量与符号引用。运行期间也可以将新的常量放入池中。如调用String类的intern()方法。
老年代(2/3)
解析成Class对象
3
JDK7将字符串常量池,静态变量从永久代移除,JDK8采用基于本地内存的Metaspace实现。
附加信息
1
当一个方法刚刚开始执行时,其操作数栈是空的,随着方法执行和字节码指令的执行,会从局部变量表或对象实例的字段中复制常量或变量写入到操作数栈,再随着计算的进行将栈中元素出栈到局部变量表或者返回给方法调用者,也就是出栈/入栈操作。一个完整的方法执行期间往往包含多个这样出栈/入栈的过程。
存放类的元数据、常量、静态变量
类加载器子系统
运行时数据区
本地方法栈
To(1/10)
Eden(8/10)
虚拟机栈
Test.class
线程私有的
2
...
栈帧
方法调用的返回地址
动态链接
对老年代GC称为Major GCFull GC触发条件:(1)调用System.gc时,此方法的调用是建议JVM进行Full GC,只是建议而非一定,但多数情况下它会触发 Full GC,从而增加(2)老年代空间不足(3)方法区空间不足(4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存(5)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
操作数栈
栈帧1
堆
当Eden区满时,触发Minor GC
class context
4
操作数栈当前指针
在一个class文件中,一个方法要调用其他方法,需要将这些方法的符号引用转化为其在内存地址中的直接引用,而符号引用存在于方法区中的运行时常量池。Java虚拟机栈中,每个栈帧都包含一个指向运行时常量池中该栈所属方法的符号引用,持有这个引用的目的是为了支持方法调用过程中的动态连接(Dynamic Linking)。这些符号引用一部分会在类加载阶段或者第一次使用时就直接转化为直接引用,这类转化称为静态解析。另一部分将在每次运行期间转化为直接引用,这类转化称为动态连接。
执行引擎
加载
新生代
永久代
5
栈帧2
局部开始指针
当前线程
From(1/10)
新生代(1/3)
0 条评论
下一页