JVM学习
2020-05-18 11:43:15 0 举报
java虚拟机学习
作者其他创作
大纲/内容
堆
Object Header(对象头)1.Mark Word(标记字段)<自身运行时数据,对象哈希值,GC分代年龄,锁状态标志,线程持有锁偏向线程ID,偏向时间戳>2.Klass pointer(类型指针)<类的元数据指针>3.数组长度<只有数组对象才有>
GC日志打印命令参数:-XX:+PrintGC 输出GC日志-XX:+PrintGCDetails 输出GC的详细日志-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息-Xloggc:../logs/gc.log 日志文件的输出路径
局部变量表:存储方法执行过程中的局部变量;
类装载子系统
Object 1
实例数据(Instance data)
testJVM
1
垃圾回收算法:可达性分析算法将\"GC Roots\"对象作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余标记为垃圾对象GC Root根节点:<线程栈的本地变量, 静态变量, 本地方法栈的变量等...>
Object 5
TestJVM.class类元信息
本地方法栈
S2(1/10)
对齐填充Padding(保证对象是8个字节的整数倍)
c=30
Egen(8/10)
TestJVM.class
GC Roots
栈(线程)
局部变量表
Full GC
方法区
Survivor区
运行时数据区(内存模型)
Object 7
GC Root Set
栈
执行引擎
存储该对象的类元信息指针
方法出口
S1(1/10)
main(栈帧)
b=2
年轻代(1/3)
仍然存活的对象
装载
动态链接
本地方法栈(native)
(线程独有,每个线程都拥有一个程序计数器,主要记录当前线程执行到的命令行数)
Object
方法区(元空间):主要存储常量,静态变量和类元信息.在JDK1.8后,该区域不再占用JVM内存,使用JVM之外的系统内存空间
栈:JVM会为每个线程分配一块独立的栈空间 来存储线程的局部变量,FILO(先进后出);
minor GC
Object 4
栈帧:线程栈中的方法单元,每个方法有自己的栈帧,方法执行结束,相应栈帧出栈,相应内存空间回收;
老年代(2/3)
Object 2
堆的内部结构包含(年轻代 + 老年代)。年轻代分为Egen 和 Survivor;当一个对象被创建之后最先被放在Egen区。当发生 minorGC时该对象会被转移到 S1区,再次发生minorGC时,对象会被转移到S2区,之后每发生一次minorGC,对象会在S1和S2两个区域转移,每转移一次该对象的生存年龄会被加一,直到该对象被转移15次(年龄到达15岁后),该对象会被转移到老年代。存在于老年代中的对象通常是像线程池之类需要一直存在直到程序结束为止的对象。如果老年代区域达到一定大小,会发生FullGC,如果FullGC不能腾出新的空间,则会发生堆内存溢出。年轻代默认(1/3 堆) Egen(8/10 年轻代) S1(1/10) S2(2/10)老年代默认(2/3堆)
method(栈帧)
操作数栈
判定可回收的对象
操作数栈:采用FILO 栈的数据结构,保存操作(add,mul)过程中的临时变量;
STW : Stop the word(当full gc发生时,所有的用户线程会被暂停等待)
Object 3
JVM虚拟机
2
(元空间)常量 + 静态变量 + 类元信息
a=1
Object 6
程序计数器
0 条评论
下一页