jvm优化-垃圾收集器的类型

分类

  • 依据线程数:串行垃圾回收器和并行垃圾回收器
  • 依据工作模式:并发垃圾回收器和独占垃圾回收器
  • 依据碎片处理:压缩垃圾回收器和非压缩垃圾回收器
  • 依据分代:新生代垃圾回收器和老年代垃圾处理器

评价GC策略的指标

可以用下列指标评价一个垃圾处理器的好坏:

  • 吞吐量:应用程序所花费的时间和系统总运行时间的比值
  • 垃圾回收器负载:垃圾器回收时间与系统运行时间的比
  • 停顿时间:垃圾回收器正在运行时,应用程序的暂停时间
  • 垃圾回收频率:指垃圾回收器多久运行一次
  • 反应时间:指当一个对象称为垃圾后,多长时间内,它所占据的内存空间会被释放。
  • 堆分配:不同的垃圾回收器对堆内存的分配方式不同。

新生代串行收集器

  • 它是单线程
  • 它是独占式
    串行收集器进行垃圾回收时,java应用程序中线程都要暂停,等待垃圾回收的完成。jvm在client模式下它是默认的垃圾回收器。

老年代串行收集器

老年代串行收集器使用的是标记-压缩算法。它也是单线程、独占式的。因此,在堆空间较大的应用程序中,一旦老年代串行收集器启动,应用程序很可能会停止几秒或者更长。

并行收集器

并行收集器是工作在新生代的,它只是将串行简单的多线程化。
1:新生代并行回收器
新生代并行回收器也是使用复制算法,并行回收器的重要特点是:它非常关注系统的吞吐量。
并行收集器通过两个重要参数决定:

  • -XX:MaxGCPauseMillis:设置最大垃圾收集停顿时间
  • -XX:GCTimeRatio:设置吞吐量的大小,它的值0~100。那么系统花费的时间不超过1/(n+1)的时间用于垃圾收集。
    2:老年代并行回收器
    老年代并行回收器也是一种多线程并发的收集器。和新生代并行回收器一样,它也关注吞吐量。它是采用的标记-压缩算法。

CMS收集器

CMS收集器主要关注系统停顿时间。CMS即并发标记清除,它是标记-清除算法,同时它也是使用多线程并行回收的垃圾收集器。
CMS收集器的GC周期由6个阶段组成。其中4个阶段(名字以Concurrent开始的)与实际的应用程序是并发执行的,而其他2个阶段需要暂停应用程序线程。

  • 初始标记:为了收集应用程序的对象引用需要暂停应用程序线程,该阶段完成后,应用程序线程再次启动。

  • 并发标记:从第一阶段收集到的对象引用开始,遍历所有其他的对象引用。

  • 并发预清理:改变当运行第二阶段时,由应用程序线程产生的对象引用,以更新第二阶段的结果。

  • 重标记:由于第三阶段是并发的,对象引用可能会发生进一步改变。因此,应用程序线程会再一次被暂停以更新这些变化,并且在进行实际的清理之前确保一个正确的对象引用视图。这一阶段十分重要,因为必须避免收集到仍被引用的对象。

  • 并发清理:所有不再被应用的对象将从堆里清除掉。

  • 并发重置:收集器做一些收尾的工作,以便下一次GC周期能有一个干净的状态。

一个常见的误解是,CMS收集器运行是完全与应用程序并发的。我们已经看到,事实并非如此,即使“stop-the-world”阶段相对于并发阶段的时间很短。

主要参数

1:吞吐量优先的并行收集器
-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集。
-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此。
-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。
2:响应时间优先的并发收集器
-XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。
-XX:+UseParNewGC:设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。
-XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。
-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片。
3:辅助信息
JVM提供了大量命令行参数,打印信息,供调试使用。主要有以下一些:
-XX:+PrintGC
输出形式:[GC 118250K->113543K(130112K), 0.0094143 secs]
[Full GC 121376K->10414K(130112K), 0.0650971 secs]

-XX:+PrintGCDetails
输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
[GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]

-XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps可与上面两个混合使用
输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]
-XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用
输出形式:Application time: 0.5291524 seconds
-XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间。可与上面混合使用
输出形式:Total time for which application threads were stopped: 0.0468229 seconds
-XX:PrintHeapAtGC:打印GC前后的详细堆栈信息

posted @ 2016-04-25 09:01  空心菜小手  阅读(282)  评论(0编辑  收藏  举报