JVM-并发垃圾回收

本文深入解析了垃圾回收算法的关键概念,包括GC停顿、并发与并行操作的区别,以及分代垃圾回收算法的工作原理。文章详细介绍了年轻代与老年代的划分及各自采用的垃圾回收策略,探讨了晋升机制、CardTable的作用,并对三色标记算法和并发标记算法进行了分析,最后还讲解了CMS算法及其参数调优方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GC停顿:拷贝算法中,对象地址会发生移动,让业务线程全部停下来,等GC完成对象地址的调整后再工作。

并发:Concurrent 指GC线程和业务线程同时工作。

并行:Parallel        指多个GC线程同时工作。

1.分代垃圾回收算法

原理:将堆分为年轻代和老年代,年轻代使用copy算法scavenge,老年代使用mark-sweep

晋升:年轻代发生GC频率高于老年代,每经历一次GC存活下来的对象age+1,当age大于Max时,被复制到老年代,参数默认是15

CardTable:避免老年代对象全部描述,引入来标记该区域老年代对象指向年轻代的指针,本质是一个位图。512字节

维护跨代引用;标记灰色节点。

2.0三色标记算法:在不同的GC中,代表不同的状态

白色:还未搜索(已经访问到,没有完成扩展,还在队列)

灰色:正在搜索(未被访问)

黑色:已经搜索完成(已经扩展完)

2.并发标记算法

漏标问题:灰色对象B对白色对象C的引用消失,A已经扩展完,C不再能被访问。

本质问题:黑色对象引用白色对象,白色对象没有其他路径引用到自己。

方法一:往前进:直接将未标记的白色对象标灰色;不会影响效率;产生浮动垃圾。

方法二:往后退:把黑色对象标灰色;Lua做法;目的减少浮动垃圾。

3.CMS

主要用于老年代对象回收,标记清除法;

初始标记(停顿)--并发标记--Remark重新标记(停顿)--并发清除

CMS参数调优

为了提高Write Barrier效率,使用card table方式进行标记;会产生浮动垃圾。

在做年轻代GC之前把card table中的内容转移到mod union table

4.基础参数

-Xmx 堆的最大size

-Xms 堆的初始size

-Xmn/NewSize 年轻代的size

SurvivorRatio 默认8 eden/survivor 分配空间

NewRatio 默认2 old/young 年轻代的大小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值