JVM-GC垃圾处理
2021-08-30 16:15:58 1 举报
JVM-GC垃圾处理,包括垃圾处理策略、垃圾处理器汇总说明、垃圾处理底层算法
作者其他创作
大纲/内容
解决方法1:增量更新(基于条件1)
1. 标记存活对象,顺序复制到保留区域2. 清除另一个半区域(变成保留区域)
STW
GC root
Object
可达性分析
标记-复制
Old
B
漏标
三色标记法
方法区常量
并发重置
GC-Root Set
Eden
Young
标记-清除
存活
GC
当黑色对象新增对白色对象的引用时,该黑色变成灰色,并发扫描结束后,重新扫描(会重新扫描A根节点,大量工作)
CMS
GCRoots
1.并发标记,低停顿2.分代收集:但新增Region3.空间整理:标记-整理4.可预测的停顿
可回收
1. 有至少一个黑色对象,在自己被标记之后,指向了白色对象2. 灰色对象在引用扫描完成之前删除了白色对象的引用
垃圾收集底层算法
parNew
可用
G1
垃圾对象判断
开始有后去掉
1. 标记存活对象,移到同一端2. 清除端边界外的区域
GCRoot
黑色:已被访问,且引用全被扫描灰色:已被访问,引用没扫描全白色:未被访问,不可达
垃圾收集器汇总
漏标出现的条件:
1.并发标记,并发清理,低停顿2. CPU敏感3. 浮动垃圾(下次GC处理)4. 空间碎片(定时整理)5. concurrent mode failure
引用计数法
1. 标记存活对象2. 清除未标记区域
JVM内部引用
三色标记
单线程
多标
下次GC处理
用户线程
筛选回收
A
垃圾回收策略
系统类加载器
栈中变量
根据对象存活的周期,将内存分配:1. 新生代:每次GC有近99%对象死去,适合用标记-复制算法2. 老年代:没有额外空间进行分配担保,无法用复制算法,故采用标记-清除或标记-整理,效率比复制慢10倍以上
开始没有后新增
本地方法栈变量
Parallel Scavenge
1. 计数器计算引用次数,次数为0回收2.无法解决相互循环引用
引用不可达:垃圾对象
D
并发清理
初始标记
方法区静态变量
并发标记
SerialOld(MSC)
Serial/Serial Old
Serial
读-写屏障实现
垃圾处理器
效率高,空间浪费
Survivor
同步锁持有者
标记-整理
C
Region
ParallelOld
效率低,空间利用高,没有碎片
当灰色对象取消对白色对象的引用时,该白色变成灰色,并发扫描结束后,重新扫描(扫描D,工作量小)
1. 优先调整堆的大小2. 内存小于100M,使用串行收集器3. 单核且没有停顿时间的要求,串行或JVM自己选择4. 允许停顿时间超过1秒,并行或JVM自己选5. 响应时间最重要且不能超过1秒,使用并发收集器6. 4G以下可以用parallel,4-8G可以用ParNew+CMS,8G以上可以用G1,几百G以上用ZGC
Parallel/Parallel Old
Humongous
保留
重新标记
ZGC
最终标记
常驻异常对象
效率低,空间碎片
解决方法2:原始快照-SATB(基于条件2)
浮动垃圾:
分代收集理论
0 条评论
下一页