垃圾回收器的分类

基础:
串行收集器:
DefNew:是使用-XX:+UseSerialGC(新生代(Serial收集器),老年代(Serial Old收集器)都使用串行回收收集器)
并行收集器:
-XX:+UseParNewGC(新生代使用并行收集器(ParNew收集器),老年代使用串行回收收集器(Serial Old))

-XX:+UseConcMarkSweepGC(新生代使用多线程收集器,老年代->CMS)。
-XX:+UseParallelOldGC(新生代,老年代都使用并行回收收集器)

-XX:+UseParallelGC(新生代使用并行回收收集器,老年代使用串行收集器)

garbage-first heap:是使用-XX:+UseG1GC(G1收集器)


搭配:

Serial收集器-年轻代
http://book.51cto.com/art/201107/278913.htm

[GC [DefNew:1986K->128K(2112K), 0.0011191 secs] 27809K->27808K(30528K), 0.0011425secs] [Times: user=0.00 sys=0.01, real=0.00 secs]
这个收集器是一个单线程的收集器,但它的“单线程”的意义并不仅仅是说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程(Sun将这件事情称之为“Stop The World”),直到它收集结束。
优点:简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率
缺点:停顿时间长



ParNew收集器-年轻代

[GC [ParNew:1990K->132K(2112K), 0.0007742 secs] 24112K->24110K(30528K), 0.0007964secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

ParNew收集器除了多线程收集之外,其他与Serial收集器相比并没有太多创新之处,但它却是许多运行在Server模式下的虚拟机中首选的新生代收集器,其中有一个与性能无关但很重要的原因是,除了Serial收集器外,目前只有它能与CMS收集器配合工作。



CMS收集器
参数设置:-Xms30m -Xmx60m-Xmn10m -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails

它运行在JAVA虚拟机的老年代中。
CMS收集器是基于“标记-清除”算法实现的

优点:并发收集、低停顿
缺点:因为占用了一部分线程(或者说CPU资源)而导致应用程序变慢,总吞吐量会降低,对CPU资源非常敏感,无法处理浮动垃圾,收集结束会产生大量空间碎片。

在并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,所以总体上来说,CMS收集器的内存回收过程是与用户线程一起并发地执行的


[GC [ParNew: 9112K->9112K(9216K), 0.0000185 secs][CMS: 47728K->51175K(51200K), 0.0184446 secs] 56840K->56814K(60416K), [CMS Perm : 2086K->2085K(12288K)], 0.0185255 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]

http://blog.csdn.net/ffm83/article/details/42874653
http://book.51cto.com/art/201107/278920.htm

Parallel Scavenge收集器-年轻代

Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput)。所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值

停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户的体验;而高吞吐量则可以最高效率地利用CPU时间,尽快地完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。


Parallel Scavenge收集器还有一个参数-XX:+UseAdaptiveSizePolicy值得关注。这是一个开关参数,当这个参数打开之后,就不需要手工指定新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRatio)、晋升老年代对象年龄(-XX:PretenureSizeThreshold)等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量,这种调节方式称为GC自适应的调节策略(GC Ergonomics)

自适应调节策略也是Parallel Scavenge收集器与ParNew收集器的一个重要区别。
2016-03-29T21:20:53.647+0800: 100078.239: [GC [PSYoungGen: 421996K->4820K(567040K)] 1602649K->1187158K(1965184K), 0.0126840 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]


Parallel Old收集器-老年代
Parallel Old收集器是JAVA虚拟机中垃圾收集器的一种。和Serial Old收集器一样,工作在JAV虚拟机的老年代。这种垃圾收集器使用多线程和“标记-整理”算法。

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

[Full GC [PSYoungGen:3394K->3394K(6848K)] [ParOldGen: 50728K->50728K(51200K)]54122K->54122K(58048K) [PSPermGen: 2084K->2084K(12288K)], 0.0071480 secs][Times: user=0.00 sys=0.00, real=0.01 secs]



PSYoungGen     total 6848K, used 3456K [0x0ad30000, 0x0b730000, 0x0b730000)
eden space 3456K, 100% used [0x0ad30000,0x0b090000,0x0b090000)
from space 3392K, 0% used [0x0b090000,0x0b090000,0x0b3e0000)
to   space 3392K, 0% used[0x0b3e0000,0x0b3e0000,0x0b730000)
ParOldGen      total 51200K, used 51176K [0x07b30000, 0x0ad30000, 0x0ad30000)
PSPermGen      total 12288K, used 2105K [0x03b30000, 0x04730000, 0x07b30000)
ParOldGen表示是Parallel old在老年代进行回收;


Serial Old收集器-老年代
老年代
serial Old收集器是串行的进行垃圾回收
[GC [DefNew: 9108K->966K(9216K),0.0049332 secs][Tenured: 46824K->46893K(46920K), 0.0033687 secs] 47800K->47790K(56136K),[Perm : 2086K->2086K(12288K)], 0.0084489 secs] [Times: user=0.02 sys=0.00,real=0.01 secs]

Tenured表示是 serial old在老年代进行回收

猜你喜欢

转载自wangxinchun.iteye.com/blog/2287284