JVM
类加载器
加载
引导类加载器
扩展类加载器
系统类加载器(最上级的加载器,加载如rt.jar)
链接
验证
准备
解析
初始化
运行时数据区
线程私有
程序计数器
java虚拟机方法栈
栈帧(存储本次执行的信息)
局部变量表
操作数栈
动态链接
方法出口
本地方法栈(Native方法)
线程共有
堆(存储对象)
字符串常量池(方法区中GC效率较低)
新生代(默认占1/3)
Eden区(默认占比8:1:1)
Survivor区(又分为 S0、S1)
老年代(默认占2/3)
方法区(存储已加载的类信息)
常量池
元空间(使用本地内存)
执行引擎
即时编译器(JIT)
代码优化器
目标代码生成器
中间代码生成器
分析器
垃圾收集器(GC)
作用于堆和方法区
判断对象是否为垃圾对象
引用计数算法
可达性分析算法
三色标记算法
垃圾回收阶段算法
标记-复制算法
优点:运行高效,不会出现“碎片”问题
缺点:需要的内存空间较大
应用场景:回收的垃圾较多时,该算法性价比最高,所以应用于新生代
标记-清除算法
优点:容易理解
缺点:效率不高,清理出来的内存空间不连续,会产生内存碎片
标记-清除-整理算法
优点:消除了内存碎片,消除了复制算法中内存减半的高额代价
缺点:效率低于复制算法,移动过程中,需要暂停用户应用程序,出现STW(stop the world)的情况
应用场景:老年代
垃圾回收器分类
单线程垃圾回收器(Serial)
新生代
Serial 串行垃圾回收器
老年代
Serial Old 串行老年垃圾回收器
多线程垃圾回收器(Parallel)
新生代
Parallel Scavenge 并行垃圾回收器
ParNew 并发垃圾回收器
老年代
Parallel Old
CMS(并发标记清除)
初始标记 STW
并发标记
重新标记 STW
并发清除 耗时最久,但可与用户线程同时进行
G1(垃圾优先)
划分区域和区域优先级机制,每次回收优先级最高的区域
将堆划分为若干个Region,每个Region是一种角色
Eden区
Survivor区
老年代区
Humongous(极大的区域) 存储大于region容量一半的对象
回收流程
初始标记 STW
并发标记
最终标记 STW
筛选回收 (GC线程基于垃圾比例和空间利用率等信息决定回收哪些区域)
并发清理 启动并发清理线程来并发清理,并回收堆内存
本地库接口
JVM详解,学习记录
最新推荐文章于 2024-07-06 16:30:29 发布