搞定JVM系列(三):JVM垃圾收集器

上文的垃圾回收策略可以看作是内存回收的抽象策略,而垃圾收集器是内存回收的具体实现,这里我们只讨论HotSpot虚拟机。

垃圾收集器有很多种,常见的有:串行收集器、并行收集器、并发收集器、CMS收集器以及最新的G1收集器。重点为CMS收集器和G1收集器。

1、Serial 收集器(串行收集器)

这是一个单线程收集器。意味着它只会使用一个 CPU 或一条收集线程去完成收集工作,并且在进行垃圾回收时必须暂停其它所有的工作线程直到收集结束( “Stop The World” :将用户正常工作的线程全部暂停掉)。

新生代采用复制算法和老年代采用标记-整理算法,都是采用的Serial收集器。特点:

  1. 针对新生代的收集器;
  2. 采用复制算法;
  3. 单线程收集;
  4. 进行垃圾收集时,必须暂停所有工作线程,直到完成,即会"Stop The World"。

2、ParNew 收集器

ParNew收集器其实就是Serial收集器的多线程版本,除了使用多线程进行垃圾收集外,其余行为(控制参数、收集算法、回收策略等等)和Serial收集器完全一样。

3、Parallel Scavenge 收集器

Parallel Scavenge收集器是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器。Parallel Scavenge收集器关注点是吞吐量(如何高效率的利用CPU),而CMS等垃圾收集器的关注点更多的是用户线程的停顿时间(提高用户体验)。特点:

  1. 新生代收集器;
  2. 采用复制算法;
  3. 多线程收集;
  4. 目标则是达到一个可控制的吞吐量(Throughput)。

4、Serial Old 收集器

收集器的老年代版本,单线程,使用标记整理算法。

5、Parallel Old 收集器

收集器的老年代版本。多线程,使用标记整理算法。

6、CMS 收集器(重点重点)

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它非常适合在注重用户体验的应用上使用,基于 标记清除 算法实现。CMS是HotSpot在JDK1.5推出的第一款真正意义上的并发(Concurrent)收集器,第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。

特点:

  1. 针对老年代
  2. 基于"标记-清除"算法(不进行压缩操作,会产生内存碎片)
  3. 以获取最短回收停顿时间为目标
  4. 并发收集、低停顿
  5. 需要更多的内存

运作步骤:

  1. 初始标记: 暂停所有的其他线程,标记GC Roots能直接关联到的对象,速度很快;
  2. 并发标记:进行GC Roots Tracing的过程
  3. 重新标记: 修正并发标记期间的变动部分,需要"Stop The World",且停顿时间比初始标记稍长,但远比并发标记短;
  4. 并发清除: 开启用户线程,同时GC线程开始对为标记的区域做清扫,回收所有的垃圾对象

缺点:

  1. 对 CPU 资源敏感;
  2. 无法收集浮动垃圾;
  3. 标记清除 算法带来的空间碎片。

7、G1收集器(重点重点)

G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器。以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征。G1的使命是在未来替换CMS,并且在JDK1.9已经成为默认的收集器。

G1是将整个堆空间分成许多个大小不等的独立区域(Region),大约有2000块,每个Region从1M到32M大小不等,在JVM启动的时候就已经分割好了,Region可采用并行的垃圾回收或 NOT STW 方式。如下图,


 

运作步骤:

  1. 初始标记(Initial Marking)
  2. 并发标记(Concurrent Marking)
  3. 最终标记(Final Marking)
  4. 筛选回收(Live Data Counting and Evacuation)

特点:

1、并行与并发

G1能充分利用CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短stop-The-World停顿时间。部分其他收集器原本需要停顿Java线程执行的GC动作,G1收集器仍然可以通过并发的方式让java程序继续执行。

2、分代收集

虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但是还是保留了分代的概念。

  • 能独立管理整个GC堆(新生代和老年代),而不需要与其他收集器搭配;
  • 能够采用不同方式处理不同时期的对象;
  • 虽然保留分代概念,但Java堆的内存布局有很大差别;
  • 将整个堆划分为多个大小相等的独立区域(Region);
  • 新生代和老年代不再是物理隔离,它们都是一部分Region(不需要连续)的集合。

3、空间整合

与CMS的“标记–清理”算法不同,G1从整体来看是基于“标记整理”算法实现的收集器;从局部上来看是基于“复制”算法实现的。是一种类似火车算法的实现,不会产生内存碎片,有利于长时间运行。

4、可预测停顿

这是G1相对于CMS的另一个大优势,降低停顿时间是G1和CMS共同的关注点,但G1除了追求低停顿外,还能建立可预测的停顿时间模型。可以明确指定M毫秒时间片内,垃圾收集消耗的时间不超过N毫秒。在低停顿的同时实现高吞吐量。

为什么G1可以实现可预测停顿?

  1. 可以有计划地避免在Java堆的进行全区域的垃圾收集;
  2. G1收集器将内存分大小相等的独立区域(Region),新生代和老年代概念保留,但是已经不再物理隔离。
  3. G1跟踪各个Region获得其收集价值大小,在后台维护一个优先列表;
  4. 每次根据允许的收集时间,优先回收价值最大的Region(名称Garbage-First的由来);

这就保证了在有限的时间内可以获取尽可能高的收集效率。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值