JVM 垃圾回收器

 垃圾收集器的互相搭配

 如上几种根据年代收集器分为两种

新生代收集器:serial,ParNew,Parallel Scavenge。

老年代收集器:CMS, Serial Old, Parallel Old。

 

Serial(新生代)

(1)新生代采用复制算法。

(2)stop the world 模式

(3)单线程收集器,单行收集。

(4)默认为虚拟机运行在Client模式下的默认新生代收集器

 

ParNew(新生代)

(1)新生代采用复制算法。

(2)stop the world 模式

(3)并行收集器。

(4)用于 server 模式下的虚拟机中首选的新生代收集器,他能与CMS配合工作。

 

Parallel Scavenge(新生代)

(1)新生代采用复制算法。

(2)stop the world 模式

(3)并行收集器。

(4)能够设置最大垃圾收集停顿时间,以及最大吞吐率的大小。

         -XX:MaxGcPauseMills 

         -XX:MaxGcPauseRatio

(5)设置垃圾收集器各个参数,内存区域各个的大小,以及进入老年代的参数

         -XX:UseAdaptiveSizePolicy

 

Serial-Old (老年代)

(1)老年代采用标记-整理算法。

(2)stop the world 模式

(3)单线程收集器,单行收集。

(4)在Server下,与Parallel Scanvenge 搭配,还可以作为 CMS 的后备预案

 

Parallel-Old(老年代)

(1)老年代采用标记-整理算法。

(2)stop the world 模式

(3)并行收集。

(4)用于注重吞吐量以及 cpu 资源敏感的场合

 

CMS(老年代)

(1)老年代采用标记-清除算法。

(2)步骤:

       1、初始标记。标记与GcRoots 直接关系的对象。Stop the World

       2、并发标记。追踪GcRoots相关联的对象。消耗时间长。

       3、重新标记。因为程序是进行的,所以需要重新对我们标记的对象进行纠正。Stop the World

       4、并发清除。

(3)优点:使停顿时间变为最短成为目标。

(4)缺点:

        1、因为CMS 默认打开的垃圾收集线程数为(CPU数量+3)/4 , 所以在 cpu 数量数目比较少的时候,会出现垃圾线程占用cpu资源相对较高。

       2、无法清除浮动垃圾,进而导致可能出现 FullGc 的出现。原因:因为在并发清除这一步骤的时候并不是采用 Stop The World 的模式,所以此时在清理过程中还是需要给一些内存用于其他的用户线程进行使用的。所以 CMS 并不会到老年代满的时候在进行垃圾回收,他的默认回收大小为 68%。其设置为:

       -XX:CMSInitiatingOccupancyFraction

     3、他会产生许多的空间碎片。因为他是使用 标记-清除算法。在出现没有内存空间可以存放的时候会出现一次 FullGc ,通过设置如下配置在进行一次 整理。

       -XX:+UseCMSCompactAtFullCollection

但是如上方法会导致经常要整理 可否多少次垃圾回收在进行一次整理呢 。配置如下

      -XX:CMSFullGCsBeforeCompaction

 

参数

参数   描述
UseSerialGC  虚拟机运行在Client下的默认值,打开此开关后,使用Serial+Serial Old的收集器组合进行内存回收
UseParNewGC打开此开关后,使用ParNew+Serial Old的收集器组合进行内存回收
UseConcMarkSweepGC 打开此开关后,使用ParNew+CMS+Serial Old的收集器组进行内存回收。Serial Old收集器将作为CMS收集器出现Concurrent Mode Failure失败后的后备收集器使用
UseParallelGC    虚拟机运行在Server模式下的默认值,打开此开关后,使用Parallel Scavenge+Serial Old(PS MarkSweep)的收集器组合进行内存回收
UseParallelOldGC     打开此开关后,使用Parallel Scavenge+Parallel Old的收集器组合进行内存回收
SurvivorRatio    新生代Eden区域与Survivor区域的容量比值,默认是8,代表Eden:Survivor=8:1
PretenureSizeThreshold  直接晋升到老年代的对象大小,设置这个参数后,大于这个参数的对象将直接在老年代分配
MaxTenuringThreshold    晋升到老年代的对象年龄。每个对象在坚持过一次Minor GC之后,年龄就加1,当超过这个数值时就进入老年代
UseAdaptiveSizePolicy动态调整Java堆中各个区域的大小以及进入老年代的年龄
HandlePromotionFailure是否允许分配担保失败,即老年代的剩余空间不足以应付新生代的整个Eden和Survivor区的所有对象都存活的极端情况
ParallelGCThreads设置并行GC时进行内存回收的线程数
GCTimeRatio  GC时间占总时间的比率,默认值为99,即允许1%的GC时间。仅在使用Parallel Scavenge收集器时生效
MaxGCPauseMillis 设置GC的最大停顿时间。仅在使用parallel Scavenge收集器时生效
CMSInitiatingOccupancyFraction设置CMS收集器在老年代空间被使用多少后触发垃圾收集。默认值为68%,仅在使用CMS收集器时生效
UseCMSCompactAtFullCollection

设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片整理。仅在使用CMS收集器时生效

CMSFullGCsBeforeCompaction设置CMS收集器在进行若干次垃圾收集后再启动一次内存碎片整理,仅在使用CMS收集器有效

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值