目录
上文https://blog.csdn.net/e5yrt2/article/details/105515473介绍了常见的垃圾回收算法,这篇文章就来说下以下三种常见的垃圾回收器,本文仅作为基础了解,并没有特别深入底层
HotSpot虚拟机提供了7种垃圾收集器,其中适用于新生代的三种,老年代的三种,还有一种新生代老年代都适用
新生代垃圾收集器:Serial收集器,ParNew收集器,Parallel Scavenge收集器
老年代垃圾收集器:Serial Old收集器,Parallel Old收集器,CMS收集器
都适用的收集器:G1收集器
所有垃圾收集器组合情况如下:
图中连线的收集器表明可以一起搭配使用
ParNew
ParNew垃圾回收器的特点就是多线程回收机制,而Serial却是单线程回收机制。采用的回收算法就是复制算法。
参数设置:
- -XX:+UseParNewGC:使用ParNew收集器
- -XX:ParallelGCThreads:用来限制垃圾收集的线程数
CMS
CMS(Concurrent Mark Sweep)垃圾回收器采用的是标记清理算法,就是标记出哪些对象时垃圾对象,然后就把这些垃圾对象清理掉。CMS的特点就是采取垃圾回收线程和系统工作线程尽量同时执行的模式处理。
具体分为以下4个阶段:
- 初始标记(CMS initial mark):标记出来所有GC Roots直接引用的对象,这时系统的工作线程会停止,进入Stop the World状态
- 并发标记(CMS concurrent mark):让系统线程可以随意创建各种新对象,对老年代所有对象进行GC Roots
- 重新标记(CMS remark):因为第二阶段有重新创建的对象,会有很多对象没有标记出来,所以要重新标记,此时再次进入Stop the World
- 并发清除(CMS concurrent sweep):清理之前标记为垃圾的对象即可
G1
上文中ParNew和CMS分别是新生代和老年代的垃圾回收器,但是它们都存在一个很不舒服的地方,就是有Stop the World现象,这个队系统运行影响是很大的,由此也就引出了G1垃圾回收器
G1是可以同时回收新生代和老年代的垃圾的,它的特点就是把Java堆内存拆分为多个大小相等的区域(Region )
具体的新生代和老年代可能是如下图这样分配的
G1回收器的主要思路就是在一个时间内,垃圾回收导致的系统停顿时间是可以指定的,我们可以控制垃圾回收对系统性能的影响。
那么如何做到呢?
G1可以做到让你来设定垃圾回收对系统的影响,他自己通过把内存拆分为大量小Region,以及追踪每个Region中可以回收的对象大小和预估时间,最后在垃圾回收的时候,尽量把垃圾回收对系统造成的影响控制在你指定的时间范围内,同时在有限的时间内尽量回收尽可能多的垃圾对象。简单说就是有多大能力(设定时间)干多大事(回收多少垃圾)。