经典垃圾收集器

一、Serial收集器

通过名字就可以知道这是一个单线程收集器,这里的单线程并不仅仅指它会用一个线程去完成垃圾收集工作,更重要的是强调它在垃圾回收时,必须要暂停其他所有的工作,直到垃圾回收结束。

其运行示意图如下:

尽管Serial收集器在垃圾收集的过程中会伴随着长时间的STOP THE WORLD,但它仍是HotSpot虚拟机运行在客户端模式下的默认新生代收集器,它相比于其他垃圾收集器,最大的优势在于简单高效,而且它的额外内存消耗是所有垃圾收集器里面最小的。

由于客户端分配给虚拟机的内存并不会特别大,收集一个几十兆甚至几百兆的新生代,垃圾收集的停顿时间完全可以控制在一百毫秒以内,这对于用户来说是可以接收的。

二、ParNew收集器

ParNew可以理解为Serial收集器的多线程版本,即在垃圾收集的时候采用并行收集而不是单线程收集。其余部分与Serial类似。

其运行示意图如下:

 

 

在单核模式下,Parallel收集器的性能会比Serial更差,因为其存在着线程交互的问题,但在多核心的环境中,其可有效地利用系统的资源,因此推荐在多核心状态下推荐使用。

三、Parallel Scavenge收集器

Parallel Scavenge收集器同样是一款新生代收集器,它基于标记-复制算法实现垃圾回收。其主要亮点在于可以达到一个可控制的吞吐量。所谓吞吐量就是处理器用于运行用户代码的时间与处理器总时间消耗的比值。

吞吐量= 用户运行代码时间 / (用户运行代码时间 + 运行垃圾收集时间)

从公式中可以看出,运行垃圾收集的时间越短,那么系统的吞吐量就会越高。事实上,Parallel Scavenge收集器也是通过控制垃圾收集时间来达到用户所需的吞吐量。可通过参数 -XX:MaxGCPauseMills来对垃圾回收过程最大的停顿时间进行设置。但此参数不可调的太小,因为如果调的太小,垃圾收集器为了达到用户所需的停顿时间,会将新生代的空间设置得很小,这样虽然单次垃圾回收的时间短了,但是从长远来看,垃圾回收将变得更为频繁,同样会影响用户的体验。

Parallel Scavenge收集器的工作示意图如下:

 四、Serial Old收集器

它是Serial的老年代版本,工作原理与Serial相同,具体可参照Serial中的描述。

五、Parallel Old收集器

它是Parallel Scavenge的老年代版本,工作原理与Serial相同,具体可参照Parallel Scavenge中的描述。

六、CMS收集器

CMS收集器旨在获得尽可能短的垃圾回收停顿时间。它通常与Serial/Parnew收集器一起使用,主要负责对老年代的回收,回收的算法是标记-清除算法。

其收集过程主要分为以下四个阶段:

1.初始标记。用于标记与GC Roots直接关联的对象,此过程直接关系到垃圾回收过程的准确性。因此需要暂停其他用户的线程。

2.并发标记。此过程将基于可达性分析,对所有存活对象进行标记,标记的过程可以与用户线程一起并发运行。

3.重新标记。在并发标记阶段,可能会存在着引用的变动(在前面的文章里有分析过,如灰色对象引用的白色对象与黑色对象相连),因此需要对这部分变动的引用进行重新标记。此过程同样关系着垃圾回收过程的准确性,因此需要暂停其他用户线程。

4.并发清除。清理掉标记阶段已经判定为死亡的对象。此过程可以与用户线程并发进行。

其工作示意图如下:

 

虽然CMS在垃圾回收的性能上相较于之前的垃圾收集器有了大幅度的提高,但依然存在着三个明显的缺点:

1.CMS对处理器资源非常敏感。具体来说就是占用了一部分处理器的计算资源导致应用程序变慢。

2.无法处理浮动垃圾。所谓浮动垃圾即在CMS收集器并发收集的过程中产生的垃圾,因为CMS的清除过程是与用户线程并发进行的,因此无法阻止浮动垃圾的产生。对于产生的浮动垃圾,只能等到下次回收时,再对其进行标记,如果浮动垃圾产生的过多,很有可能会导致依次FULL GC的发生。

3.产生大量的内存碎片。CMS垃圾收集器基于标记-清除算法,在此过程中会产生大量的内存碎片,同样可能造成FULL GC的发生。

七、G1垃圾收集器

相比于CMS收集器,G1收集器旨在可以达到用户期望的垃圾回收时间。相比于CMS,它做出的最大突破是打破了CMS及其他垃圾收集器按分代进行相应回收策略的思想。它将内存分成了各个大小相等的独立区域。衡量回收的标准不再是分代,而是回收哪块内存的性价比最高。

G1的垃圾回收过程可分为以下四个步骤:

1.初始标记。用于标记与GC Roots直接关联的对象,此过程直接关系到垃圾回收过程的准确性。因此需要暂停其他用户的线程。

2.并发标记。此过程将基于可达性分析,对所有存活对象进行标记,标记的过程可以与用户线程一起并发运行。

3.最终标记。在并发标记阶段,可能会存在着引用的变动(在前面的文章里有分析过,如灰色对象引用的白色对象与黑色对象相连),因此需要对这部分变动的引用进行重新标记。此过程同样关系着垃圾回收过程的准确性,因此需要暂停其他用户线程。

4.筛选回收。更新各个区域(Region)中的数据,对各个Region中的回收成本进行和回收价值进行相应的排序。然后根据用户期望的停顿时间,选择一个或对个合适的Region进行回收。在此过程中为了防止浮动垃圾的产生,需要暂停其他用户线程。同时,回收过程基于标记-整理算法,不会产生内存碎片。

其主要工作示意图如下:

相比于CMS,G1的内存占用和额外负载都要高于CMS。

在内存占用方面,G1在解决跨代引用时需要维护的卡表远比CMS更加复杂,而且因为堆中的任一个Region都可以充当新生代或者是老年代,因此,每一个区域都要维护一份卡表(CMS仅老年代需要维护卡表,新生代不需要)。

在执行负载方面,G1的写屏障相比CMS会消耗更多的运算资源,因为CMS写屏障是直接的同步操作,而G1则是类似消息队列的结构,把写前屏障和写后屏障中要做的事都放在队列里,然后再做异步处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值