JVM运行原理流程图
2023-05-10 22:36:14 0 举报
JVM运行原理流程图
作者其他创作
大纲/内容
出栈 回到执行位置
方法区(元空间)
安全
垃圾回收
from (1/10)
出栈
变量存储空间
方法区的静态变量指向堆实例
本地方法栈
Java Math.class
FILO 栈
局部变量
Test t1
解析
Test t2
变量临时存储空间
User class loader
文件格式、元数据、字节码验证、符号引用
main ——栈帧 默认大小 1M
Minor GC
使用
详情
不管什么样的数据都会先存储到Eden区(默认情况),Eden区存储多大对象由-XX:PretenureSizeThreshold指定,默认大小是0
连接
初始化
young (1/3)
Full GC
new Test()
1、对象已死?a、直接引用:堆中对象是否互相引用b、对象可达性分析算法:GC Root 根是否存在存活对象2、算法a、复制算法 :复制存活对象b、标志-清除:标志“死亡对象”,回收内存c、标志-整理:在上面的基础上进行内存“偏移”达到清理碎片要求3、收集区域a、新生代:Minor GC轻量级GC 时间段,标志复制算法b、老年代old:Major GC/Old GC/Full GC 难以消亡 标志-清除 标志-整理Full GC:整个堆内存(以及方法区),并会伴随一次Minor GC4、收集器a、serial 串行收集器b、serial old 串行收集器c、par new 多线程并行收集器jdk 1.8 d、Parallel Scavenge 多线程吞吐量收集器CPU执行用户代码时间/(CPU执行用户代码时间+垃圾回收时间)e、parallel old 多线程并行收集器f、CMS 收集器 多线程并发 GC无需等待g、G1 收集器 分区域(rigion块)CMS回收器
call() 方法——>栈帧
程序计数器
Application class loader Classpath
线程共享
注:没有固定的from区,每一次发生GC的都是from区
记录线程执行行数
线程A
运行时数据区域
拓展类加载器
类装载子系统
1
启动类加载器
过程
卸载
执行
准备
符号引用——>直接引用
Test.class
Eden区存活对象复制到from(survivor0)区,然后Eden区和from区一起发生YGC(young GC)将存活的对象拷贝到to区域,此时Eden区域和to区域再次发生YGC将存活对象拷贝到from区域一次循环往复
创建对象开辟内存
堆
执行引擎
常量 静态变量 类元信息
验证
%JRE_HOME%/lib/ext
线程独享
变量
static修饰的变量的初始化以及分配内存
.......
双亲委派模型
如果minor gc还存活的数据则会到survivor区域
Eden (8/10)
应用程序加载器
自定义加载器
动态链接
虚拟机
Bootstrap class loader %JAVA_HOME%/lib
局部变量表
方法出口
修改
赋值给 int a = 1
加载
操作变量
old (2/3)
直接内存
to (1/10)
1.7时叫永久代,1.8叫元空间,同时MethodArea(方法区)知识一个逻辑概念区域,而且在1.8时元空间不在堆内存中,也并不属于JVM管理而是直接由操作系统管理
aload 应用变量入栈astore 赋值给变量并压入局部变量表中
分代年龄 ==15,CMS 6
栈(线程)
0 条评论
回复 删除
下一页