八、垃圾回收器
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