JVM garbage collector notes finishing

Serial collector

历史最久远的垃圾收集器,采用复制算法,依旧是虚拟机运行在Client模式下的默认新生代收集器。

advantage:

 1. 简单而高效(与其他收集器的单线程相比);对于限定单个CPU的环境来说,Serial收集器由于没有线程开销,专心做垃圾收集自然可以获得最高的单线程收集效率。

shortcoming

1.在多核CPU环境下,效率较低,无法在Server模式下发挥优势。

Summarize

Serial收集器对于运行在Client模式下的虚拟机来说是一个很好的选择。

ParNew collector

ParNew收集器其实就是Serial收集器的并行多线程版本,采用复制算法,新生代收集器

advantage

1.多线程进行垃圾回收,在多核CPU下相对Serial来说,效率较高。
2.目前除了Serial收集器之外,只有ParNew能与CMS收集器配合。

shortcoming

1.在单核CPU的环境中,由于存在线程开销,所以效率比较低下。

Summarize

多线程版本的Serial收集器,在核CPU下能有良好的收集效率,目前依旧是许多运行在Server模式下的虚拟机的首选新生代收集器。
主要的原因有两点,
第一,性能相对来说较好;
第二,目前除了Serial收集器外只有ParNew能与CMS收集器配合使用。

Parallel Scavenge Collector

该收集器也是一个新生代收集器,采用复制算法,是并行的多线程收集器,并且是能够控制吞吐量的收集器。

advantage

1.能控制停顿时间,可以自适应调节新生代的大小,Eden与Survivor区的比例等参数。

shortcoming

1.停顿时间和吞吐量不可兼得,追求小停顿时间,就需要牺牲吞吐量。

Summarize

Parallel Scavenge 收集器是ParaNew的增强版,能够控制吞吐量和停顿时间,但是只能以一个纬度调整,大吞吐量必然需要长时间停顿;
同时该收集器可以自适应调整内存参数,可以根据监控信息调整新生代大小以及Eden与Survivor区的比例等参数。

Serial Old collector

该收集器是Serial收集器的老年代版本,单线程收集器,使用“标记-整理”算法。

Summarize

该收集器的主要意义在于给Client模式下的虚拟机使用,如果用在Server模式下,主要用途有两点:
1.用在jdk1.5之前的版本中于Parallel Scavenge收集器搭配使用;
2.作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure 时候使用。

Parallel Old Collector

该收集器是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法.

Summarize:

该收集器是在JDK1.6中才开始提供,在此之前,新生代的Parallel Scavenge收集器一直处于比较尴尬的地位。
原因在于,如果新生代选择了Parallel Scavenge收集器,老年代除了Serial Old(PS MarkSweep)收集器外别无选择,而PS+Serial Old的组合在老年代很大的情况下,
这种组合就会很鸡肋甚至都不一定有ParNew+CMSz组合“给力”,
所以Parallel Old的收集器出现后,“吞吐量优先”收集器总算摆脱了尴尬的地位,在注重吞吐量以及CPU资源敏感的场合,都可以考虑Parallel Scavenge+Parallel Old 组合。 

CMS collector

CMS收集器是一种以获取最短回收停顿时间为目的的收集器。采用“标记-清理”收集算法,收集过程主要包括4个步骤:
1.初始标记
2.并发标记
3.重新标记
4.并发清除
其中,初始标记、重新标记依旧需要“Stop The World”。

advantage

并发收集、低停顿。

shortcoming:

1.CMS收集器对CPU资源非常敏感,由于会占用一部分线程,所以可能会导致程序变慢,总吞吐量会降低。CMS默认启动的线程数是(CPU+3)/4,也就是当CPU在4个以上时候,并发回收时垃圾收集线程不少于25%的CPU资源,并随着CPU数量的增加而下降。
2.CMS收集器无法处理浮动垃圾,可能出现 “Concurrent Mode Failure" 失败导致另一次Full GC的发生。当产生Full GC 时,就需要启用Serial Old 收集器来重新进行老年代的垃圾收集,这样停顿的时间就更长了。
3.由于CMS 采用“标记-清理”算法收集,所以就会造成收集结束后会有大量的空间碎片产生。如果空间碎片过多,会造成分配大对象无法分配内存,不得不提前触发Full GC。不过,CMS提供了碎片化整理的参数来解决这个问题。

G1 collector

G1(Garbage-First)收集器是当今收集技术发展的最前沿成果之一。它是一款面向服务端应用的垃圾收集器。
该收集器独自管理整个java堆,把java堆划分多个大小相等的独立区域(Region),虽然新生代和老年代的概念都保留,但是新生代和老年代却不再是屋里隔离,它们都是一部分Region的集合。
基本回收步骤:
1.初始标记
2.并发标记
3.最终回收
4.筛选回收

Features analysis:

1.G1收集器采用“化整为零”的思路进行垃圾回收,G1跟踪各个Region里面的垃圾堆的价值(回收所获得的空间大小以及所花费的时间的比率)大小,在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region。这中使用Region划分内存空间以及优先级的区域回收方式,保证了G1收集器在有限的时间内可以获取尽可能搞的收集效率。
2.由于划分都是采用Region的形式收集垃圾,那么就会存在Region之间存在对象引用,极端情况下,虚拟机有可能出现全堆扫描的情况,但是虚拟机使用Remembered Set解决这个问题。
G1中每个Region都有一个与之对应的Remembered Set ,虚拟机发现程序在对Reference类型的数据进行写操作的时候,检查Reference引用的对象是否处于不同的Region之中(在分代的例子中就是检查是否老年代的对象引用了新生代中的对象),如果是,变通过CardTable把相关引用信息记录到被引用对象所属的Region的Remembered Set之中。
当进行内存回收时,在GC根节点的枚举范围中加入Remembered Set即可保证不对全堆扫描,也不会有遗漏。

advantage:

1.并行与并发
2.空间整合
3.可预测的停顿

shortcoming:

G1收集器目前在商用层面的案例较少,没有表现出足够的性能优势,随着后续对G1的优化,这一问题应该可以解决。

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324912900&siteId=291194637