【JVM】垃圾回收器总结(2)——七种垃圾回收器类型 (2)

【JVM】垃圾回收器总结(2)——七种垃圾回收器类型

并发标记清除GC(CMS)

CMS收集器是一个以获取最短回收停顿时间为目标的收集器。适合应用在互联网站或BS系统的服务器上,因为这类场景重视服务器的响应速度,希望系统的停顿时间尽可能短。CMS适合堆内存大、CPU核数多的服务器端应用,也是G1出现之前大型应用的首选收集器。

CMS的优势是并发收集停顿少,并发是指与用户线程一起执行。

开启收集器的JVM参数:-XX:+UseConcMarkSweepGC 开启后会自动开启 -XX:+UseParNewGC

【JVM】垃圾回收器总结(2)——七种垃圾回收器类型

并发标记清除收集器的组合:ParNew + CMS + Serial Old(作为CMS出错的后备收集器,增强健壮性)

CMS内存回收一共有4个过程

初始标记:只有标记一下GC Roots能直接关联的对象,速度很快,仍然需要暂停所有的工作线程。

并发标记:进行GC Roots跟踪的过程,和用户线程一起工作,不需要暂停工作线程,主要标记过程,标记全部对象。

重新标记:修正在并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,仍然需要暂停所有的工作线程。由于并发标记时,用户线程依然运行,因此在正式清理前再做修正。

并发清除:清除GC Roots不可达对象,和用户线程一起工作,不需要暂停工作线程。基于标记结果,直接清理对象。由于耗时最长的并发标记和并发清除过程中,垃圾收集线程可以和用户线程一起并发工作。所以总体上说CMS收集器的内存回收和用户线程是并发执行的(初始标记和重新标记虽然要暂停,但是用时很短)。

优点:并发收集,停顿次数少。

缺点:对CPU的压力大,CMS在收集和应用线程会同时增加对堆内存的占用,也就是i说CMS必须在老年代堆内存用完之前完成GC,否则CMS会回收失败,将触发担保机制,Serial Old会以STW(Stop The World,暂停所有工作线程)的方式进行依次GC,从而造成较大的停顿时间。而且采用标记清除算法会产生内存碎片。

【JVM】垃圾回收器总结(2)——七种垃圾回收器类型

Serial Old收集器

Serial Old收集器是Serial垃圾收集器老年代版本,同样是单线程的收集器,使用标记整理算法。

主要运行在Client默认的JVM老年代垃圾回收器。

在Server模式下,主要有两个用途:

在JDK1.5之前与新生代Parallel Scavenge收集器搭配使用。(Parallel Scavenge+Serial Old)

作为老年代版中使用CMS收集器的后备垃圾回收方案。

G1垃圾回收器

内容较多,见【JVM】垃圾回收器总结(3)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwxwff.html