Java垃圾回收
2021-06-03 16:33:08 2 举报
1. 目前存在的各种垃圾回收算法介绍 2. 新生代与老年代的垃圾收集组合JVM垃圾收集器 Serial ParNew Parallel CMS G1
作者其他创作
大纲/内容
S0
可回收
5
初始标记
未使用
在并发标记和并发清理过程中,用户线程仍然在运行,就必然会伴随新的垃圾出现;由于这些垃圾对象产生于标记之后,CMS不能在当前阶段清除掉它们。只好在下一次清除掉它们.
GC线程
Region
并行:多个GC线程进行垃圾回收,新生代用并行,老年代串行
Eden
老年代采用标记整理算法
用户线程
重新标记
重置线程
回收前:
筛选回收
1
Obj
并发标记
GC Root可达的对象的标记
可达对象
ParNew
清除
可达性算法
新生代的对象更新快,所以使用标记复制算法
对上个阶段新产生的对象进行标记
漏标对象
条件1:Eden区满条件2:GC停顿时间 >= 200 ms,
串行:单个GC线程
回收后:
标记复制
垃圾回收器
新生代默认堆内存 5%,最大可扩展到60%;Eden:S0:S1 的内存占比 8:1:1。大对象判定:对象超过一个Region大小的50%
Concurrent Mark Sweep 一种获取最短回收停顿时间为目标的收集器:1. 对处理器资源非常敏感;(不会让用户线程停顿,但是会导致变慢)2. 无法处理“浮动垃圾”,从而可能导致一次完全的 Stop The World;3. 基于“标记-清除算法“,会产生大量的内存碎片;(需要进行内存整理)
Mixed GC
虽然没有内存碎片,但是浪费了一半的资源
1. 根据Regine回收价值和成本进行排序;2. 根据用户期望停顿时间指定回收计划。
S1
存活对象
Survivor的Region
-XX:MaxGCPauseMills指定停顿时间,默认200ms
标记阶段
标记清除
针对老年代,使用标记清除算法
并发重置状态等待下次CMS的触发
GC Root对应的对象标记
Concurrent
最终标记
GC roots
并发清理未标记对象
面向服务器,主要针对配备多个处理器及内存量大的机器,以满足停顿时间和高吞吐量的要求
引用计数法:
Serial
内部维护了一个优先队列,每次根据允许的收集时间,优先选择回收价值最大的Region
浮动垃圾:
固定可作为GC root对象
不可达对象(将被回收的对象)
并发清理
三个基本垃圾回收算法
Stop The World
循环引用
新生代
GC Roots
老年代
ParallelScavenge
垃圾回收算法
不仅进行正常的新生代垃圾收集,同时也回收部分后台扫描线程标记的老年代分区。
1. 内存分区Region2. 会对内存进行整理,不会有很多内存碎片3. 增加预测机制,用户可以指定期望停顿时间4. 每次GC不需要对整个老年代的进行
Full GC
1. G1 遵守分代理论进行设计,但是不再固定大小和固定数目的分代区域划分,而是将Java堆分为多个大小相等的固定区域Region;2. 将堆分为大小相同的Region,最多2048个;Region具有类型,并且类型可动态改变(新生代 -> 老年代)。
老年代的大对象Region
对应组合过时了
标记清理
3
G1
新生代采用标记复制算法
产生大量内存碎片
对象
备选方案
类似于ParNew,但是更注重于吞吐量的垃圾回收器吞吐量=用户线程运行时间/(用户线程运行时间+GC运行时间)
Young GC
引用计数法:用引用计数器统计被引用的数目(存在循环依赖的问题)可达性分析:根据GC Roots进行搜索,对对象进行标记,若对象未被标记则对象可回收。换句话说:从GC Roots开始不可达的对象就是可回收对象。
停止所有用户线程,只是进行垃圾回收
Garbage First
速度慢了很多,效率降低
Serial Old
Parallel Scavenge
对象已死
新生代的Region
CMS
保留区
产生垃圾
并发Concurrent
2
清除不可达对象
标记整理
并行Parallel
CMS(Concurrent Mark Sweep)
老年代的Region
分代垃圾回收(新生代)
Parallel Old
执行流程
4
串行Serial
等待下一次的CMS的触发
Region划分
1. 虚拟机栈中引用的对象2. 本地方法栈 JNI 引用的对象3. 方法区(static对象,常量池对象)4. JVM内部引用(Class对象,常驻异常Exception,ClassLoader)5. JVM内部情况的JMXBean,JVMTI注册回调对象6. synchronized所持有的对象
在混合回收过程中,当内存不足时也会触发Full GC
0 条评论
回复 删除
下一页