搜索
您的当前位置:首页正文

Java虚拟机 -- 垃圾收集器

来源:吉趣旅游网

 

新生代垃圾收集器

Serial收集器(-XX:+UseSerialGC,复制算法)可以指定年轻代的垃圾回收器

  • 单线程收集,进行垃圾收集时,必须暂停所有工作线程
  • 简单而高效,Client模式下默认的年轻代收集器

ParNew收集器(-XX:+UseParNewGC,复制算法)

  • 多线程收集,其余行为,特点和Serial收集器一样
  • 单核执行效率不如Serial,在多核下执行才有优势
  • 默认开启的收集线程数与CPU数量相同

Parallel Scavenge收集器 -- 吞吐量优先收集器(-XX:UseParallelGC,复制算法)

  • 吞吐量 = 运行用户代码时间 /(运行用户代码时间+垃圾收集时间)
    • CPU用于运行用户代码的时间与CPU总消耗时间的比值,比如,虚拟机总共运行了100分钟,其中垃圾回收花费1分钟,那吞吐量就是99%。
  • 比起关注用户线程停顿时间(CMS等收集器,停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验),更关注系统的吞吐量(能更好的利用CPU,适合在后台运行,而不需要太多交互)
  • 在多核下执行才有优势,Server模式下默认的年轻代收集器
  • GC自适应调节策略
    • -XX:+UseAdaptiveSizePolicy 通过打开该参数可以让收集器根据当前系统的运行情况自适应的调节最合适的停顿时间或者最大吞吐量

老年代垃圾收集器

Serial Old收集器(-XX:+UseSerialOldGC,标记-整理算法)

  • 单线程收集,进行垃圾收集时,必须暂停所有工作线程
  • 简单高效,Client模式下默认的老年代收集器

Parallel Old收集器 JDK6 (-XX:+UseParallelOldGC,标记-整理算法)

  • 多线程,吞吐量优先
  • 经常与Parallel Scaveng配合使用与注重吞吐量以及CPU敏感的场合

CMS收集器 并发收集,低停顿(-XX:+UseConcMarkSweepGC,标记-清除算法) 注重服务器的响应速度

执行流程:

  • 初始标记:stop-the-world
  • 并发标记:并发追溯标记,程序不会停顿
  • 并发预清理:查找执行并发标记阶段从年轻代晋升到老年代的对象
  • 重新标记:暂停虚拟机,扫描CMS堆中的剩余对象
  • 并发清理:清理垃圾对象,程序不会停顿
  • 并发重置:重置CMS收集器的数据结构

缺点:

  • 会产生空间碎片,CMS提供一个 -XX:+UseCMSCompactAtFullCollection 开关参数(默认是开启的),用于在CMS收集器不要进行FullGC时开启内存碎片的合并整理过程,内存整理的过程是无法并发的,空间碎片问题没有,但停顿时间就会变长。
  • 浮动垃圾:由于CMS并发清理阶段用户线程还在运行着,伴随程序运行自然会有新垃圾产生,这部分垃圾得标记过程之后,所以CMS无法在当收集中处理掉他们,只好留待下一次GC清理掉,这一部分垃圾称为浮动垃圾。在jdk1.5默认设置下,CMS收集器当老年代使用了68%的空间就会被激活,可以通过-XX:CMSInitialOccupancyFraction的值来提高触发百分比,在jdk1.6中CMS启动阈值提升到了92%,要是CMS运行期间预留的内存无法满足程序的需要,就会出现”Concurrent Mode Failure“,然后降级临时启用Serial Old收集器进行老年代的垃圾收集,这样停顿时间就很长了,所以-XX:CMSInitialOccupancyFraction设置太高容易导致大量”Concurrent Mode Failure“,并发模式失败。
  • 对CPU资源敏感,CMS默认启动的回收线程数是(cpu数量+3)/4。所以CPU数量少会导致用户程序执行速度降低较多。

G1收集器:(-XX:+UseG1GC,复制+标记-整理算法)

  • 并发与并行
  • 分代收集
  • 空间整合
  • 可预测的停顿

    好文传送门 --->  

 

 

因篇幅问题不能全部显示,请点此查看更多更全内容

Top