首页 > 编程语言 > 详细

Java垃圾回收之老年代垃圾收集器

时间:2019-04-06 12:03:18      阅读:156      评论:0      收藏:0      [点我收藏+]

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

  1.1 单线程收集,进行垃圾收集时,必须暂停所有工作线程

  1.2 简单高效,Client模式下默认的老年代收集器

技术分享图片

 

2、Parallel Od收集器(-XX: +UseParallelOldGC  ,标记-整理)

  2.1 JDK6 之后才有这个收集器,多线程,吞吐量优先,如果注重CPU资源和吞吐量的场合,可以使用这个组合 Parallel Scavenge + Parallel Old 收集器

 

 技术分享图片

3、CMS收集器(这个收集器,占据了老年代收集器的半壁江山。-XX:+ UseConcMarkSweepGC ,标记-清除算法,有碎片产生

  优点:几乎可以和用户线程做到同时工作,本质还是要STOP-THE WORLD,只是停顿时间短

  如果在老年代中存活更多存活率高的对象,使用CMD收集器更适合

 

  收集流程:(一边掉垃圾一边打扫)

  初始标记:stop-the-world,从垃圾回收的根对象开始,只是扫描和根对象有关联的对象并做标记。虽然暂停了所有的线程工作,但是停顿时间很短。

  并发标记:并发追随标记,程序不会停顿

  并发预清理:查找执行并发标记阶段从年轻代晋升到老年代的对象

  重新标记:暂停虚拟机,扫描CMS堆中的剩余对象

  并发清理:清理垃圾对象,程序不会停顿

  并发重置:重置CMS收集器的数据结构

技术分享图片

 

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

  Garbage First 收集器的特点

  4.1 并发和并行

  4.2 分代收集

  4.3 空间整合

  4.4 可预测的停顿

  说明:这个收集器的内存布局与其他收集器有很大区别

  将整个JAVA堆内存划分成多个大小相等的Region

  年轻代和老年代不再物理隔离

技术分享图片

额外知识:JDK11 有 Epsilon GC 和 ZGC (研发阶段)

 

问题:为什么年轻代中的Parallel Scavenge收集器不能和老年代中的CMS收集器一起工作呢?

---》因为Parallel Scavenge收集器(G1)都没有使用传统的GC收集器代码框架,都是另外独立开发的。

而Serial,parNew,CMS都有使用了部分相同的收集器代码框架,所有他们三个是兼容的。

(CMS是hotsport在jdk5才出来的真正意义上是并行收集器,第一次让垃圾收集线程和用户线程一起工作。)

 

Java垃圾回收之老年代垃圾收集器

原文:https://www.cnblogs.com/vingLiu/p/10661114.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!