JVM解析<四>垃圾回收器

89 阅读4分钟

八、垃圾回收器

8.1GC评估指标

  • 吞吐量:程序的运行时间(程序的运行时间+内存回收的时间)
运行用户代码时间/(运行用户代码时间+运行垃圾收集时间)
  • 垃圾收集开销:吞吐量的补数,垃圾收集器所占时间与总时间的比例。
  • 暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间。
  • 收集频率:相对于应用程序的执行,收集操作发生的频率。
  • 内存占用:Java堆区所占的内存大小。
  • 快速:一个对象从诞生到被回收所经历的时间。

现在JVM调优标准:在最大吞吐量优先的情祝下,降低停顿时间。

8.2垃圾回收器的分类

  • 串行回收器: serial、 serial old
  • 并行回收器: ParNew、Parallel scavenge、Parallel old
  • 并发回收器:CMS、G1

8.3Parallel GC(注重吞吐量,JDK8默认垃圾回收器)

特点

  • Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput),它也被称为吞吐量优先的垃圾收集需。
  • 自适应调节策略也是Parallel Scavenge与ParNew一个重要区别。

8.4CMS(注重停顿时间)

新生代与ParNew(默认)和Serial收集器搭配 初始标记(STW):暂时时间非常短,标记与GC Roots直接关联的对象。 并发标记(最耗时):从GC Roots开始遍历整个对象图的过程。不会停顿用户线程 重新标记:(STW):修复并发标记环节,因为用户线程的执行,导致数据的不一致性问题(关注垃圾从不可达到可达,不关注可达到不可达--浮动垃圾) 并发清理(最耗时)将垃圾清除

优点

  • 并发收集
  • 低延迟

缺点:

  • 会产生内存碎片
  • CMS收集器对CPU资源非常敏感
  • CMS无法处理浮动垃圾(对象可达---》不可达)

8.5G1(在保证最大吞吐量的同时,降低停顿时间,JDK9默认回收器)

  • 并行与并发
    • 并行性:G1在回收期间,可以有多个GC线程同时工作,有效利用多核计算能力。此时用户线程STw
    • 并发性:G1拥有与应用程序交替执行的能力,部分工作可以和应用程序同时执行,因此,一般来说,不会在整个回收阶段发生完全阻塞应用程序的情况
  • 分代收集
    • 从分代上看,61依然属于分代型垃圾回收器,它会区分年轻代和老年代,年轻代依然有Eden区和Survivor区。但从堆的结构上看,它不要求整个Eden区、年轻代或者老年代都是连续的,也不再坚持固定大小和固定数量。
    • 将堆空间分为若干个区域(Region) ,这些区域中包含了逻辑上的年轻代和老年代。
    • 和之前的各类回收器不同,它同时兼顾年轻代和老年代。对比其他回收器,或者工作在年轻代,或者工作在老年代;

8.6 GC参数设置

8.6.1通用参数设置

    //设置老年代占用比例默认是 新生代:老年代1:2
    -XX:NewRation=2

    //设置新生代占用最大内存
    -Xmn

    //设置Eden区占用比例 默认 Eden区:From Survivor 区:To Survivor 区  8:1:1
    -XX:SurvivorRatio

    //true为使用 false为不使用 空间分配担保策略
    -XX:HandlePromotionFailure

    //设置新生代去老年代的次数默认是15
    -XX:MaxTenuringThreshold=
   
    //打印GC详细信息
    -XX:+PrintGCDetails

    //TLAB设置是否开启默认为true
    -XX:+UseTLAB

    //设置tlab空间大小
    -XX:TLABwasteTargetPercent

    //设置永久代初始大小
    -XX:Metaspacesize=10m 

    //设置永久代最大值
    -XX:MaxMetaspaceSize=10m

    //控制开启编译器的server还是client模式
    -XX:+RewriteFrequentPairs

    //设置JIT调用阈值,超过当前阈值就会触发JIT编译
    -XX: CompileThreshold

    //是否关闭热度衰减
    -XX:-UseCounterDecay

    //热度衰减时长,单位为秒
    -XX:CounterHalfLifeTime

8.6.2 parallel gc相关参数设置

    //指定垃圾回收器
    -XX:+UseParallelGC

    //指定老年代垃圾回收器
    -XX:+UseParallelOldGC

    //设置年轻代并行收集线程数
    -XX:ParallerGCThreads
    在默认情况下,当CPU 数量小于8个,ParallelGCThreads的值等于CPU 数量。
    当CPU数量大于8个,Paralle1GCThreads的值等于3+[5* CPu_Count]/8]。

    //设置最大停顿时间
    -XX:MaxGCPauseMillis

    //设置垃圾总占比时间,用户衡量吞吐量的大小,取值范围(0,99)
    -XX:GCTiimeRatio

    //设置自适应调节策略 默认开启
    -XX:UseAdaptiveSizePolicy

8.6.3 G1垃圾回收器参数设置

    //设置垃圾回收器
    -XX:+UseG1GC

    //设置Region大小默认是堆内存的1/2000,范围是1MB-32MB
    -XX:G1HeapRegionSize

    //设置期望最大GC停顿时间,默认是200ms
    -XX:MaxGCPauseMillis

    //设置STW时GC线程数,最多设置为8
    -XX:ParallelGCThreads

    //设置并发标记的线程数
    -XX:ConcGCThread

    //设置触发并发GC周期的java堆占用率阈值,超过就触发GC,默认是45
    -XX:InitiatingHeapOccupancyyPercent