java垃圾收集器

垃圾收集器是垃圾收集算法的具体实现。根据具体的场景选择适合的垃圾收集器。

Serial 收集器 (-XX:+UseSerialGC(年轻代)   -XX:+UseSerialOldGC(老年代))

Serial (串行)收集器是最早最古老的垃圾收集器。是单线程收集器,就是一个垃圾收集器线程去处理垃圾收集工作。收集垃圾的过程会暂停其他工作线程,(Stop The World)简称STW,知道收集结束。

新生代采用复制算法,老年代采用标记-整理算法。

优点:简单、高效。单线程执行 没有其他线程资源的开销。

缺点:收集需要STW,暂停其他应用线程的执行,需要等待收集完成。造成用户体验不好。

Serial Old收集器是Serial收集器的老年代版本,它同样是一个单线程收集器。它主要有两大用途:一种用途是在JDK1.5 以及以前的版本中与Parallel Scavenge收集器搭配使用,另一种用途是作为CMS收集器的后备方案。

Parallel Scavenge收集器(-XX:+UseParallelGC(年轻代)-XX:+UseParallelOldGC(老年代))

parallel收集器是serial收集器的多线程版本,就是多个线程去处理垃圾收集,其他(控制参数、收集算法、回收策略等等)和Serial收集器类似。默认线程数量和cpu核数相同,可以用参数-XX:ParallelGCThreads配置线程数,但是一般不推荐修改。

parallel收集器关注的是吞吐量(高效利用cpu),cms等收集器关注的是用户形成的停顿时间(提高用户体验)。所谓吞吐量就是cpu中用于运行用户代码的的时间与cpu总耗时间的比值。Parallel Scavenge收集器提供了很多参数供用户找到最合适的停顿时间或最大吞吐量,如果对于收集器运作不太了解的话,可以 选择把内存管理优化交给虚拟机去完成也是一个不错的选择。

新生代采用复制算法,老年代采用标记-整理算法。

Parallel Old收集器是Parallel Scavenge收集器的老年代版本。使用多线程和“标记-整理”算法。在注重吞吐量以及 CPU资源的场合,都可以优先考虑 Parallel Scavenge收集器和Parallel Old收集器(JDK8默认的新生代和老年代收集 器)。

ParNew收集器(-XX:+UseParNewGC)

跟parallel收集器类似,主要区别在于它可以和CMS算法一起配合使用。

新生代采用复制算法,老年代采用标记-复制算法。

 它是许多运行在Server模式下的虚拟机的首要选择,除了Serial收集器外,只有它能与CMS收集器(真正意义上的并发收 集器,后面会介绍到)配合工作。

CMS收集器(-XX:UseConcMarkSweepGC(老年代))

cms(concurrent Mark Sweep)收集器是一种以获得最短回收停顿时间为目标的收集器。非常符合注重用户体验的应用上使用,它是HotSpot虚拟机第一款真正意义上的并发收集器,它第一次基本上实现了让垃圾收集器线程与用户线程同事工作。

CMS采用标记-清除算法。整个过程分为四个步骤:

   初始标记:暂停所有其他用户线程(STW),并留下gc roots直接能引用的对象,速度很快。

   并发标记:并发标记阶段就是从gc roots的直接关联对象开始 遍历整个对象图的过程,这个过程比较长,但是不需要停顿用户线程,可以和垃圾收集线程一起并发执行。但是因为有用户线程在继续运行,可能会导致已经标记过的对象状态发生改变。

   重新标记:重新标记阶段就是为了修正并发标记期间因为用户线程继续运行导致的标记产生变化的对象的标记记录,这个过程的停顿时间会比初始标记的时间稍微长,但远远比并发标记的时间短。主要用到三色标记里的增量更新算法做重新标记。

  并发清理:开启用户线程,垃圾收集线程也同时对未标记的空间进行清理,这个阶段如果有新对象生成会被标记为黑色不做任何处理。

  并发重置:重置本次垃圾收集过程的标记数据。

 优点:并发收集、低停顿。

缺点:

会抢占cpu资源;

无法处理浮动垃圾(在并发标记和并发清理的时候又会产生垃圾,这种只能等到下次gc才能被回收)

使用标记-清理算法,收集结束会产生大量空间碎片,可以通过配置一个参数:-XX:+UseCMSCompactAtFullCollection让jvm在标记清除后做整理操作。

执行的过程中不确定,会存在上一次垃圾回收还没执行完,然后下一次垃圾回收又被触发,特别是在并发标记和并发清理的时候会出现,一边回收,系统一边运行,还没回收就再次触发full gc,也就是"concurrent mode failure",此时会进入stop the world,用serial old垃圾收集器来回收

CMS的相关核心参数

1. -XX:+UseConcMarkSweepGC:启用cms

2. -XX:ConcGCThreads:并发的GC线程数

3. -XX:+UseCMSCompactAtFullCollection:FullGC之后做压缩整理(减少碎片)

4. -XX:CMSFullGCsBeforeCompaction:多少次FullGC之后压缩一次,默认是0,代表每次FullGC后都会压缩一 次

5. -XX:CMSInitiatingOccupancyFraction: 当老年代使用达到该比例时会触发FullGC(默认是92,这是百分比)

6. -XX:+UseCMSInitiatingOccupancyOnly:只使用设定的回收阈值(-XX:CMSInitiatingOccupancyFraction设 定的值),如果不指定,JVM仅在第一次使用设定值,后续则会自动调整

7. -XX:+CMSScavengeBeforeRemark:在CMS GC前启动一次minor gc,目的在于减少老年代对年轻代的引 用,降低CMS GC的标记阶段时的开销,一般CMS的GC耗时 80%都在标记阶段

8. -XX:+CMSParallellnitialMarkEnabled:表示在初始标记的时候多线程执行,缩短STW

9. -XX:+CMSParallelRemarkEnabled:在重新标记的时候多线程执行,缩短STW;

对于JDK8默认的垃圾回收器是-XX:+UseParallelGC(年轻代)和-XX:+UseParallelOldGC(老年代),如果内存较大(超过4个G,只是经验 值),系统对停顿时间比较敏感,我们可以使用ParNew+CMS(-XX:+UseParNewGC -XX:+UseConcMarkSweepGC)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值