zoukankan      html  css  js  c++  java
  • Java垃圾回收之老年代垃圾收集器

    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才出来的真正意义上是并行收集器,第一次让垃圾收集线程和用户线程一起工作。)

  • 相关阅读:
    POJ3159 Candies —— 差分约束 spfa
    POJ1511 Invitation Cards —— 最短路spfa
    POJ1860 Currency Exchange —— spfa求正环
    POJ3259 Wormholes —— spfa求负环
    POJ3660 Cow Contest —— Floyd 传递闭包
    POJ3268 Silver Cow Party —— 最短路
    POJ1797 Heavy Transportation —— 最短路变形
    POJ2253 Frogger —— 最短路变形
    POJ1759 Garland —— 二分
    POJ3685 Matrix —— 二分
  • 原文地址:https://www.cnblogs.com/vingLiu/p/10661114.html
Copyright © 2011-2022 走看看