JVM的CMS(concurrent mark sweep)四个阶段详细介绍

1.initial mark(初始标记):通过GC roots找到根对象,这个过程会STW(stop the world),由于根对象并不多,所以STW的时间不会长。

2.concurrent mark(并发标记):这个过程其他工作线程也在改变引用的指向,即一边进行垃圾标记一边又改变这引用指向,可能又经历了垃圾变成非垃圾,非垃圾变成垃圾(这个过程是耗时最长的,所以并发去标记,不影响工作线程,缩短了SERAL单线程清理的STW时间,自然就提高了效率),所以还有第三阶段的重新标记。

3.remark(重新标记):因为并发标记的过程,产生的垃圾也不会太多,虽然也是会STW(STW的原因是在标记的时候如果又产生指向改变,那就又陷入了这个过程,所以STW暂时让指向不变保证完全标记),但是重新标记不会耗时太多,到这阶段,就完成了标记工作。

4.concurrent sweep(并发清理阶段:在并发清理的过程中其实工作线程也在工作,也会产生垃圾,这部分垃圾成为浮动垃圾,这些个垃圾在这次是不能清理了,只有等下一次垃圾清理。

备注:CMS细分是六阶段;被清理的这些垃圾包括,线程栈变量、静态变量、常量池、JNI指针

CMS(Concurrent Mark Sweep)是一种并发的垃圾回收器,它的主要优势是尽可能地减少应用程序的停顿时间。下面是CMS垃圾回收器的实现原理: 1. 初始标记(Initial Mark):这个阶段会暂停应用程序的线程,标记出所有的根对象,即 GC Roots,比如静态变量和活动线程等。这个阶段很快就完成了,但是应用程序会被短暂地暂停。 2. 并发标记(Concurrent Mark):在这个阶段,垃圾回收器会扫描堆中的对象,标记出所有活跃的对象,这个阶段与应用程序是并发执行的,所以不会停顿程序执行。因为这个阶段与应用程序并发执行,所以在这个阶段,堆中的对象可能会发生变化,因此需要在下一个阶段扫描时重新确认它们是否仍然是活跃的。 3. 重新标记(Remark):在这个阶段,垃圾回收器会重新遍历堆中的对象,标记出在并发标记阶段发生变化的对象。这个阶段需要暂停应用程序,但是它的时间通常比初始标记阶段更短。 4. 并发清除(Concurrent Sweep):在这个阶段,垃圾回收器会扫描堆中的对象,清除所有被标记为垃圾的对象。这个阶段与应用程序是并发执行的,因此不会停顿程序执行。由于在清除对象时不需要移动对象,因此这个阶段的性能通常比标记阶段更高。 需要注意的是,CMS垃圾回收器并不会移动对象,因此当堆中的对象达到一定的程度时,会出现碎片化的问题。为了解决这个问题,JVM还提供了G1(Garbage First)垃圾回收器。 另外,CMS垃圾回收器虽然能够减少应用程序的停顿时间,但是在执行过程中会产生一些额外的负载,因此需要根据应用程序的特点和需求来选择合适的垃圾回收器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值