GC分类与性能指标
分类:
- 按线程数分:串行垃圾回收器(硬件配置低,单CPU;Client模式下)和并行垃圾回收器,都会STW
- 按工作模式分:并发式垃圾回收器(交替工作)和独占式垃圾回收器
- 按碎片处理方式:压缩式垃圾回收器和非压缩式垃圾回收器(指针碰撞、维护空闲列表)
- 按工作的内存区间分:年轻代垃圾回收器和老年代垃圾回收器
性能指标:
- 吞吐量(throughput):运行用户代码的时间占总时间(程序运行时间+内存回收)的比例,越大越好
- 垃圾收集开销:吞吐量的补数
- 暂停时间(pause time):STW时间,越小越好
- 收集频率:收集操作发生的频率
- 内存占用:java堆区所占的内存大小
- 快速:一个对象从诞生到被回收所经历的时间
高吞吐量较好是因为让用户感觉到只有用户线程在工作
低延迟较好是因为让用户感觉到自己线程不被打断
目标:在最大吞吐量优先的情况下,降低停顿时间
不同的垃圾回收器概述
- 1999 Serial GC,ParNew Serial的多线程版本
- 2002 Parallel GC,Concurrent Mark Sweep GC(CMS)
- 2012 G1
- 2017 G1为默认垃圾收集器
- 2018 G1垃圾回收器的并行完整垃圾回收
- 2018.9 Epsilon 又称为No-op,ZGC(可伸缩的低延迟垃圾回收器)
- 2019.3 增加G1
- 2019.9 增强ZGC
- 2020.3 jdk14中删除CMS
7种经典垃圾回收器:
- 串行回收器:Serial,Serial Old
- 并行回收器:Parallel,Parallel Scavenge,Parallel Old
- 并发回收器:G1,CMS
组合关系:
-XX:+PrintCommandLineFlags
package chapter17;
import java.util.ArrayList;
public class PrintGCTest {
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<>();
while (true){
byte[] bytes = new byte[100];
list.add(bytes);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
-XX:InitialHeapSize=132742784 -XX:MaxHeapSize=2123884544 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
hello world
Serial回收器:串行回收
Serial 采用复制算法、串行回收和 “Stop the World”机制的方式执行内存回收
Serial Old 采用标记-压缩算法、串行回收和 “Stop the World”机制的方式执行内存回收。Client模式下老年代的垃圾回收器;在Server 模式下 1)与新生代的Parallel Scavenge配合使用,2)作为老年代CMS收集器的后背垃圾收集方案。
简单高效,单核CPU会用
-XX:+UserSerialGC :新生代使用Serial GC,老年代使用Serial Old GC
-XX:InitialHeapSize=132742784 -XX:MaxHeapSize=2123884544 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+