JVM 内存区域划分 JDK1.8
2021-01-18 22:59:28 0 举报
JVM 内存区域划分
作者其他创作
大纲/内容
2
堆
字节码执行引擎
老年代(2/3)
Survivor
垃圾回收算法:可达性分析算法将“GC Roots”对象作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余标记为垃圾对象GC Root根节点:线程栈的本地变量,静态变量,本地方法的变量等
TestJVM.class类元信息
对象指针
Object 4
仍然存活的对象
Container
动态链接
Object 5
From(1/10)
局部变量
test2
JVMTest.class
方法出口
GC Roots
本地方法栈
STW: Stop the word (当发生FullGC时,所有的用户线程会被暂停等待)
user
操作数栈
Object 3
运行时数据区(内存模型)
Object
main()-栈帧
程序计数器
Object Header(对象头)1.Mark Word(标记字段)<自身运行时数据,对象哈希值,GC分代年龄,锁状态标志,线程持有锁偏向线程ID,偏向时间错>2.Klass Pointer(类型指针)<类的元数据指针>3.数组长度<只有数组对象才有>
装载
操作数栈:采用FILO栈的数据结构,保存操作(add,mul)过程中的临时变量
Object 2
方法区(元空间)常量,静态变量,类元信息(class)
类装载子系统
Object 6
c=30
compute()-栈帧
堆的内部结构包含(年轻代+老年代)。年轻代分为Egen和Survivor;当一个对象被创建之后 最先被放在Egen区。当发生minorGC是该对象会被转移到S1区,再次发生minorGC时,对象会被转移到S2区之后每发生一次minorGC,对象会在S1和S2两个区转移,没转移一次,对象的生存年龄会被加一,知道改对象被转移15尺(年龄到达15岁),该对象会被转移到老年代。存在于老年代中的对象通常是线程池之类需要一直在知道程序结束为止的对象。如果老年代区域达到一定大小,就会发生FullGC,如果FullGc不能腾出新的空间,则会发生堆内存溢出。年轻代默认(1/3堆)Egen(8/10 年轻代)S1(1/10)S2(1/10)老年代默认(2/3堆)
栈(线程)
实例数据(Instance data)
存储该类的类元信息指针
GC Roots Set
Eden(8/10)
Full GC
栈帧:线程栈中的方法单元,每个方法有自己的栈帧,方法执行结束,相应栈帧出栈,相应内存空间收回
test1
Object 1
对齐填充Padding(保证对象是8个字节的整数倍)
JVM虚拟机
年轻代 1/3
栈:JVM会为每个线程分配一个独立的栈空间来存储线程的局部变量,FILO(先进后出)
a=1
局部变量表:存储方法执行过程中的局部变量
方法区(元空间)存放常量、静态变量、类元信息
To(1/10)
1
Object 7
对象头存储该类的类元信息
minor GC
b=2
栈(线程栈)
收藏
0 条评论
下一页