JVM垃圾收集器总结

HotSpot 虚拟机在 JDK 1.7 之后提供了7款垃圾收集器,分别是:

1.Serial收集器
2.ParNew收集器
3.Parallel Scavenge收集器.
4.Serial Old收集器
5.Parallel Old收集器
6.CMS收集器
7.G1收集器

其中Serial、ParNew和Parallel Scavenge是新生代垃圾收集器,而Serial Old、Parallel Old和CMS是老年代垃圾收集器,
G1收集器进行收集的范围是整个java堆,包括新生代和老年代。

各个垃圾收集器的搭配情况如下:
在这里插入图片描述
下面对各个垃圾收集器进行总结:

1.Serial收集器

在JDK1.3之前是新生代手机的唯一选择,这个收集器是一个单线程的收集器,但它的单线程的意义并不仅仅说明它只会使用一个CPU或一条手机线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。
这个收集器是虚拟机运行在Client模式下的默认新生代收集器,它也有优于其他收集器的地方:简单而高效,由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。

2.ParNew收集器

ParNew收集器其实就是Serial收集器的多线程版本,是许多运行在Server模式下的虚拟机中首选的新生代收集器,其中一个与性能无关但很重要的原因是,除了Serial收集器之外,目前只有它能与CMS收集器配合工作。
补充:ParNew收集器除了多线程外,其余的行为、特点和Serial收集器一样。单线程下不如Serial,多线程下的话对系统资源的利用更有效。

3.Parallel Scavenge收集器

Parallel Scavenge收集器是一个并行的多线程的收集器,使用复制算法,看上去和ParNew一样,但Parallel Scavenge收集器的目标是达到一个可控制的吞吐量。所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。
停顿时间短适合需要与用户交互的程序,良好的响应速度能提升用户体验,而高吞吐量适合后台运算。
由于与吞吐量关系密切,Parallel Scavenge收集器也经常被称为"吞吐量优先"收集器。而且自适应调节策略也是Parallel Scavenge收集器与ParNew收集器的一个重要区别。

Serial Old收集器

Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用"标记-整理"算法。这个收集器的主要意义也是在于给Client模式下的虚拟机使用。

5.Parallel Old收集器

在注重吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge加Parallel Old收集器的组合。

6.CMS收集器

CMS收集器是一种以获取最短回收停顿时间为目标的收集器。

7.G1收集器

G1收集器的特点如下:
1.并行与并发:G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿的时间,部分其他收集器原本需要停顿Java线程执行的GC动作,G1收集器仍然可以通过并发的方式让Java程序继续执行。
2.分代收集:G1可以不需要其他收集器配合就能独立管理整个GC堆,并且还能获得更好的收集效果。
3.空间整合:G1从整体来看是基于"标记-整理"算法实现的收集器,从局部上来看是基于"复制"算法实现的,能提供规整的可用内存。这种特性有利于程序长时间运行,分配大对象时不会因为无法找到连续内存空间而提前触发下一次GC。
4.可预测的停顿:这是G1相对于CMS的另一大优势。
“CMS仍然是我现在的选择,但是随着Oracle对G1的持续改进,我相信G1会是最终的胜利者。如果你现在采用的收集器没有出现问题,那就没有任何理由去选择G1,如果你的应用追求低停顿,那G1现在已经可以作为一个可尝试的选择,如果你的应用追求吞吐量,那G1并不会为你带来什么特别的好处”

---------------------------------------------------------- 分割线 ----------------------------------------------------------

cms和g1的区别:
一、使用范围不一样
CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用。
G1收集器收集范围是老年代和新生代,不需要结合其他收集器使用。
二、Stop The World的时间
CMS收集器以最小的停顿时间为目标的收集器。
G1收集器可预测垃圾回收的停顿时间(建立可预测的停顿时间模型)
三、垃圾碎片
CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片。
G1收集器使用的是“标记-整理”算法,进行了空间整合,降低了内存空间碎片。
四、垃圾回收的过程不一样
CMS:初始标记 --> 并发标记 --> 重新标记 --> 并发清除
G1: 初始标记 --> 并发标记 --> 最终标记 --> 筛选回收

对第三点的补充:有人会好奇为什么标记清理算法会产生内存碎片!但是CMS仍采用这种算法呢?因为CMS作为第一款实现用户线程和收集线程并发执行的收集器,当时的设计理念是减少停顿时间,最好是能并发执行;但是问题来了,如要用户线程也在执行,那么就不能轻易的改变堆中对象的内存地址,不然会导致用户线程无法定位引用对象,从而无法正常运行,而标记整理算法和复制算法都会移动存活的对象,这就与上面的策略不符,因此CMS采用的是标记清理算法。CMS失败后使用备案Serial Old收集器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值