JVM GC CMS

#CMS

全称 Concurrent Mark Sweep

本质是标记-清除算法,针对老年代的GC。进行了改进,缩短了STW的时间。

阶段:

  • 初始标记 Initial Mark(STW)

    标记GC ROOT和年轻代对象能直接关联到的对象。

    CMS initial mark

  • 并发标记

    由前阶段标记过的对象出发,所有可到达的对象都在本阶段中标记。 GC线程和用户线程并发执行。Old代不是所有存活对象会被标记

  • 并发预清理 Concurrent Preclean

    JVM将包含变异对象的堆区域(称为“Card”)标记为“脏”

    g1-08

  • Concurrent Abortable Preclean

    ??

  • Final Remark (STW)

    最终标记所有的老年代的存活对象。

  • Concurrent Sweep

    删除未标记的对象并回收它们占用的空间。

###安全点(safepoint)

程序只有在运行到安全点的时候,才可以暂停下来。HotSpot采用主动中断的方式,让执行线程在运行期轮询是否需要暂停的标志,若需要则中断挂起。

可达性

1.本身是根对象。根(root)是指由堆以外空间访问的对象。JVM会将以下对象标记为根:

a.虚拟机栈(栈帧中的本地变量表)中引用的对象;

b.方法区中的类静态属性引用的对象;

c.方法区中的常量引用的对象;

d.本地方法栈中JNI的引用对象。

2.被一个可达的对象引用。

参考:https://plumbr.io/handbook/garbage-collection-algorithms-implementations/concurrent-mark-and-sweep