码迷,mamicode.com
首页 > 其他好文 > 详细

JVM-垃圾收集器

时间:2014-12-15 00:12:55      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:jvm   垃圾收集器   g1   cms   parallel   

本篇主要介绍一下JVM的几种垃圾收集器。其示意图如下所示,上面的三个是新生代的收集器,下面三个是老年代的收集器,其中G1收集器是可以用于新生代和老年代的收集工作。

bubuko.com,布布扣

JVM垃圾收集器


1、Serial(串行收集器):用于新生代GC,复制算法,启动时默认为Client模式,GC的线程为单线程。缺点是因为单线程GC,会造成中断的时间(Sop-the-world)比较大。(对于单核的CPU来说,比并行收集的效率要高)其示意图如下所示:

bubuko.com,布布扣

Serial串行收集器


2、ParNew(并行收集器):与Serial类似,不同点在于它一般用于新生代的并行回收,而且通常情况下运行在Server模式(单核CPU下,性能可能比Serial还要差)。示意图如下所示:

bubuko.com,布布扣

ParNew并行收集器


3、Parallel Scavenge(并行回收):用于新生代回收,复制算法,并行收集。与ParNew的不同是它的关注点不同,它可以精确的控制吞吐量。【吞吐量= 程序运行时间/(程序运行时间 + 垃圾收集时间),例如:JVM共运行了100min。其中垃圾收集花掉1min,那吞吐量就是99%】示意图如下所示:

bubuko.com,布布扣

Parallel Scavenge并行收集


4、Serial Old(串行收集器):是Serial收集器的老年代版本,使用标记-压缩(标记-整理)收集算法,主要用于启动模式为Client的JVM。示意图可以参考Serial串行收集器。


5、Parallel Old(并行收集器):是Parallel的老年代版本,使用标记-压缩(标记-整理)收集算法。其示意图可以参考Parallel并行收集。


6、CMS(concurrent mark sweep):并发收集器(发生GC时,GC线程与应用线程同时运行)。是一种以最短响应为目标的收集器,适用于B/S架构的运行环境。使用标记-清除算法,因此会产生大量的内存碎片。CMS的收集大概可以分为一下几个步骤:【初始标记 initial mark】--->【并发标记 concurrent mark】--->【重新标记 remark】--->【并发清除 concurrent sweep】。其示意图如下所示:

bubuko.com,布布扣

CMS并发收集器

7、G1收集器:是一款面向服务端的收集器,未来有可能替代CMS收集器。G1收集器具备以下特点:

a、并发与并行:能充分利用多核CPU的硬件特性来缩短停顿时间(Stop-the-world),可以与应用线程一同运行。

b、分带搜集:与其他收集器一样,分代的概念在G1中也存在。G1可以自己独立的去管理GC,它能够采用不同的方式去处理不同存活时间的对象。

c、空间整合:从整体上看G1使用的是标记-压缩(整理)的GC算法。这就意味着在JVM运行的时候不会产生大量的内存碎片,从而可以让程序长时间的运行。

d、可预测的停顿:与CMS相比,G1除了可以有更短的停顿时间之外,还可以建立可预测的停顿时间模型。

不计算Remembered Set的操作,G1收集器的运作大概可以分为以下几个步骤:【初始标记 initial marking】--->【并发标记 concurrent marking】--->【最终标记 final marking】--->【筛选回收 live data counting and evacuation】

bubuko.com,布布扣

G1并发并行收集


GC参数总结

-XX:+<option> 启用选项

-XX:-<option> 不启用选项

-XX:<option>=<number> 

-XX:<option>=<string>


  • -XX:+UseSerialGC:在新生代和老年代使用串行收集器
  • -XX:SurvivorRatio:设置eden区大小和survivior区大小的比例
  • -XX:NewRatio:新生代和老年代的比
  • -XX:+UseParNewGC:在新生代使用并行收集器
  • -XX:+UseParallelGC :新生代使用并行回收收集器
  • -XX:+UseParallelOldGC:老年代使用并行回收收集器
  • -XX:ParallelGCThreads:设置用于垃圾回收的线程数
  • -XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
  • -XX:ParallelCMSThreads:设定CMS的线程数量
  • -XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发
  • -XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理
  • -XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
  • -XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
  • -XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收
  • -XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候,才进行CMS回收

GC参数组合

GC参数------------------------------------------------------------------Young------------------------tenured

====================================================================

-XX:+UseSerialGC----------------------------------------------------Serial-------------------------Serial Old

-XX:+UseParallelGC--------------------------------------------------Parallel Scavenge -------Serial Old

-XX:+UseConcMarkSweepGC-------------------------------------ParNew----------------------CMS  

-XX:+UseParNewGC-------------------------------------------------ParNew----------------------Serial Old

-XX:+UseParallelOldGC---------------------------------------------Parallel Scavenge---------Parallel Old

-XX:+UseConcMarkSweepGC -XX:+UseParNewGC--------Serial--------------------------CMS 

-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC-------G1-----------------------------G1


JVM-垃圾收集器

标签:jvm   垃圾收集器   g1   cms   parallel   

原文地址:http://blog.csdn.net/fouy_yun/article/details/41894955

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!