3. JVM垃圾回收
2021-07-27 18:37:45 1 举报
JVM垃圾回收器
作者其他创作
大纲/内容
老年代:标记-整理算法
O
H
CMS并发标记清除垃圾回收器
垃圾回收器算法
并发清理
E
最终标记(基本同CMS)
目标
并发标记(同CMS)
暂停应用线程(STW),标记GC Roots的直接引用对象,耗时短。支持单线程或并行标记
STW
JVM垃圾回收
年轻代
并发重置
Humongous
ZGC
垃圾回收器
修正并发标记过程中,用户线程继续运行导致的标记对象状态发生的变更, 主要用到三色标记里的原始快照算法(CMS用的是增量更新)。这个过程比初始化标记时间稍长,也会进行STW
单线程执行回收
Parallel并行垃圾回收器
多线程执行回收
分代收集理论
S
G1
新生代:复制算法
过程:1 标记垃圾位 2 存活为调整成连续的覆盖垃圾位优点:空间连续,节省空间
ParNew
选择垃圾收集器
1. 垃圾回收效率低2. 基本已不使用
1. -XX:+UseConcMarksweepGC :启用 cms 2. -XX:ConcGCThreads · 并发的 GC 线程擞 3. -XX:+UsecMscompactAtFullcollection : FullGC 之后做压缩整理(减少碎片) 4. -XX:CMsFullGCsBeforeCompaction:多少次FullGC 之后压缩一次,默认是0,代表每次 FullGc 后都会压缩一次 5. -XX:CMSInitiatingOccupancyFraction :当老年代使用达到该比例时会触发 FullGC (默认是 92,这是百分比) 6. -XX:+UseCMSInitiatingOccupancyOnly :只使用设定的回收阈值(-XX : CMSInitiatingoccupancyFaction 设定的值),如果不指定, JVM 仅在第一次使用设定值,后续则会自动调整 7. -XX:+CMSScavengeBeforeRemark :在CMS GC前启动一次minor gc。目的在于减少老年代对年轻代的引用.降低CMS GC 的标记阶段时的开销,一般 CMS 的 GC 耗时 80 %都在标记阶段8. -XX:+CMSParallelRemarkEnabled:表示初始化标记的时候多线程执行,减少STW (默认开启)
应用程线程
筛选回收
标记清除算法
标记整理算法
ParallelNew并行垃圾回收器
Serial串行垃圾回收器
并发标记
Eedn
Survivor
1. 支持TB级别内存2. STW时间不超过10毫秒3. 吞吐量降低不超过15%4. 奠定未来GC 基石
Parallel Old
回收线程
修正并发标记过程中,用户线程继续运行导致的标记对象状态发生的变更, 主要用到三色标记里的增量更新算法。这个过程比初始化标记时间稍长,也会进行STW
切换
Epslion
过程:1 标记垃圾位 2 清楚垃圾位缺点:1. 效率问题(如果标记对象太多,效率不高) 2. 空间问题(清楚后会产生大量不连续的碎片)
初始化标记
1. Paraller 的升级, 做到可以和CMS兼容搭配使用2. ParNew负责新生代垃圾回收,CMS负责老年代垃圾回收
复制算法
JDK11开始支持
Old
Parallel
ShenandoahG1增强版
过程:1 内存空间分成两块 2 将存活的空间复制整理到另外一半空间优点:1. 效率高缺点:2. 浪费空间, 不适合老年代,只适合对象回收比较频繁的情况
老年代和年轻代可以采用不同的垃圾回收算法
CMS
Serial Old
初始化标记(同CMS)
还在试验阶段
清理重置本次GC过程中的数据标记
优点: 用户线程挺短时间短缺点: 1. 抢用户线程CPU资源 2. 无法处理浮动垃圾, 需要等待下一次GC 3. 标记清除算法,会产生大量空间碎片, 可手动配置标记清楚后再做碎片整理 4. 上一次垃圾回收还没执行完,新的一次垃圾回收被触发,特别是在并发标记和并发清理阶段会出现, 一遍回收,系统一遍运行,也许没回收完就再次出发Full GC,也就是“并发失败”,此时进入STW,垃圾回收器会被切换到Serial Old进行回收(一次性)
老年代
重新标记
Serial
0 条评论
下一页