深入理解JVM之垃圾回收器


上一篇文章提到的垃圾回收机制可以说是垃圾回收的方法论,这篇文章提到的垃圾回收器则是具体的实现。

垃圾回收器

Serial收集器

Serial是最基本、历史最悠久的一个单线程收集器,这里的单线程不仅指他仅仅利用一个CPU进行一条收集线程,而且意味着当serial在进行垃圾收集时,其他所有的工作线程都将被停止(被称作Stop The World)。书中举了一个形象的例子,“当妈妈在打扫房间时,你需要老老实实德坐在椅子上或者房间外待着,不能她一边打扫你一遍扔垃圾”。

Serial与Serial Old收集器

可以看到,当GC线程启动时其他所有工作线程都被停止,专心做垃圾清理。这样或许会给用户带来“Stop The World”的不好体验,但应用于Client模式下进禁区管理一两百兆的新生代内存仅仅会产生几十到一百多毫秒的停顿,这么一看还是可以接受的,另外单线程相对于多线程的一个显著优势在于省去了线程切换,也就意味着全神贯注的去进行垃圾收集工作。

ParNew收集器

parNew 收集器是Serial收集器的多线程版本,在垃圾收集是采用多条线程。多线程并不意味着比单线程更高的效率,尤其是在单核CPU情况下,多线程意味着需要浪费多余的实践来进行线程之间的转换(因为单核CPU只能实现并发,而无法实现并行操作),只有当CPU数量增加后,ParNew收集器的并行优势才会得以体现。下图是ParNew收集器与Serial Old收集器运行示意图。

在这里插入图片描述

Parallel Scavenge收集器

Parallel Scavenge收集器也是一个新生代收集器,它和ParNew有很多相似点,都是并行操作,都利用复制算法,都需要暂停所有用户线程。Parallel Scavenge收集器的特殊之处在于它的目标是达到可控制的吞吐量,而上面所说的几种收集器更侧重于缩短等待时间。这里我们来解释一下吞吐量的,吞吐量=运行用户代码时间/(运行用户代码时间+垃圾手机时间)也就意味着,可以认为吞吐量是用来描述计算机在多大比例上为用户服务,而不是自己在收拾垃圾。高吞吐量意味着CPU的有效利用率更高,可以完成程序的运算任务,所以这种收集器适合在后台运算而不是交互任务,交互任务要求更高的响应速度。

Serial Old收集器

Serial Old收集器是Serial收集器的老年带版本,他也是一个单线程收集器,采用标记整理算法。这个收集器主要用在Client模式下,在Server模式下主要有下面两个用途:一是在JDK1.5及之前版本,由于Parallel Old收集器还未出现,Parallel Scavenge收集器只能够和Serial Old结合使用;二是zuoweiCMS收集器的后备预案,在并发手机发生Concurrent Mode Failure的时候被使用。’

Parallel Old收集器

正如上文所提,在JDK1.5及之前,如果在新生代选择Parallel Scavenger收集器,在老年代只能选择Serial Old收集器与之配合,这会使得Parallel Scavenge收集器产生的性能优势被Serial Old收集器拖累,在整体上看并不一定会比ParNew加CMS的组合吞吐量大。而Parallel Old收集器的出现,真正让吞吐量优先收集器名副其实,Parallel Scavenge与Parallel Old的组合真正能够提高吞吐量。

CMS收集器

CMS(Concurrent Mark Sweep)收集器的目的是获取最短停顿时间,这也就意味着它适合于用户交互任务。CMS的名字可以看出,他是多线程,利用标记清理算法的收集器。它的运作分为四个步骤初始化标记、并发标记、重新标记、并发清理。
在初始化标记和重新标记阶段需要Stop The World。初始化标记中只标记和GC Roots直接关联的对象,并发标记阶段根据GC Roots链进行搜索,重新标记阶段是为了修正在并发表及阶段由于用户程序运行而导致改变的标记。初始化标记最快,并发标记耗时最长,重新标记比初始化稍长,但会远低于并发标记。
CMS收集器依然有它的不足之处,比如在并发标记阶段,如果CMS占据了大量的CPU资源(默认启动的垃圾收集线程数量是(CPU数量+3)/4;当CPU数量为1,则被全占,用户线程停滞;CPU数量为2,启动一个垃圾收集线程,CPU被占50%),用户程序就会被挤占,使得用户体验下降。为了解决上面的问题,又引入了“增量式并发收集器”,它会让用户线程和垃圾收集线程交替运行,减少垃圾收集线程独占时间,但这样会延长整个垃圾收集时间。
另外,CMS收集器无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。在并发清理阶段,用户程序产生的垃圾无法被CMS收集器收集到,这部分垃圾被称为浮动垃圾。所以CMS收集器需要给浮动垃圾预留一部分空间,默认值是当老年代达到68%时激活CMS收集器。如果预留空间不能够容纳浮动垃圾就会启动预备方案也就是上问题道德Serial Old收集器来对老年代进行垃圾收集。
CMS的最后一个缺点就是其本身采用“标记-清理”算法所带来的问题,清理后的内存存在大量不连续的碎片。可以提供一个专门整理碎片的过程,不过这又不得不Stop The World 了。

G1收集器

G1收集器相较于CMS收集器有两大优势:一是G1收集器基于“标记-整理”算法,减少了内存碎片;二是它可以精确控制停顿,可以规定在M时间内最多只能有N时间进行垃圾收集,这就保证了响应速度和用户体验。与之前垃圾收集器不同的是,G1收集器将堆划分为多个大小固定的独立区域,每次根据允许的时间去收集垃圾最多的区域,这保证了G1收集器可以在有限时间内获得最大的收集效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值