JVM垃圾回收

三色标记

首先所有对象都是白色。三色标记大致流程是扫描gc roots集合,拿到直接引用的对象,将这部分对象从白色标记成灰色。灰色集合对象是自己被扫描过,但是没有它们的下属节点还没有呗扫描过。然后对灰色集合进行并行扫描,扫描它门的下属节点,这些下属节点被标记为灰色,而之前灰色的节点被标记为黑色。然后一直循环扫描,直至没有灰色节点。如果有剩下的白色节点,说明没有被使用,是需要清理的对象。

CMS回收算法

CMS基于三色标记回收算法的一种常见算法。

大致流程如下:

1、先stw,拿到gc roots,然后遍历它门的直接引用对象,然后结束stw;

2、并发执行三色标记;

3、然后再执行stw,把白色的再扫描一遍;把第二步执行扫描期间发生变动的节点再扫描一遍,防止有些白色的节点后面突然被引用,被误清理的问题。

4、清理白色的节点对象

G1回收算法

G1会把堆内存分成很多块大小相等的区域region:伊甸园区、surviror区和老年区。G1回收器大致流程如下:

1、先stw,遍历gc roots的直接引用对象,结束stw

2、并行标记,和CMS一样

3、再次stw,再次标记,类似重新标记

4、清理对象

有了CMS为啥要G1

现在服务器内存空间已经很大了,几十几百G的很常见。不像早期机器内存比较小。

CMS会全部扫描整个堆内存,G1由于把内存分成很多小的region,不需要每次gc扫描全部堆栈。扫描出发mininor gc的region即可。由于区块较小,还会做指针碰撞,压缩使用到的内存,减少内存碎片。

posted @ 2026-11-04 10:49  ACityWalker  阅读(1)  评论(0)    收藏  举报