JVM

22-垃圾回收器

2021-06-21  本文已影响0人  紫荆秋雪_文

一、GC分类与性能指标

1、按照 "线程数" 分,可以分为串行垃圾回收器和并行垃圾回收器 串行垃圾回收&并行垃圾回收.png

2、按照 "工作模式" 分,可以分为并发式垃圾回收器和独立式垃圾回收器

3、按照 "碎片处理方式" 分,可以分为 压缩式垃圾回收器 和 非压缩式垃圾回收器

4、按照 "工作的内存区间" 分,可以分为 年轻代垃圾回收器 和 老年代垃圾回收器

二、评估 GC 的性能指标

1、吞吐量(a / (a + b)):运行用户代码的时间(a)占总运行时间的比例

2、垃圾收集开销(b / (a + b)):垃圾收集所用时间与总运行时间的比例

3、暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间

4、收集频率:相对于应用程序的执行,收集操作发生的频率

5、内存占用:Java 堆区所占的内存大小

6、快速:一个对象从诞生到被回收所经历的时间

小结

三、不同的垃圾回收器

1、垃圾收集器发展历史

有了虚拟机,就一定需要收集垃圾的机制,这就是Garbage Collection,对应的产品我们称为 Garbage Collector

2、7款经典的垃圾收集器

3、垃圾收集器的组合关系

垃圾收集器的组合关系.png
-XX:+PrintCommandLineFlags
jinfo -flag 相关垃圾回收器参数 进程ID

实测

public class GCUseTest {
    public static void main(String[] args) {
        List<byte[]> list = new ArrayList<>();
        while (true) {
            byte[] arr = new byte[100];
            list.add(arr);
            try {
                Thread.sleep(10);
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
jps
12689
29764 GCUseTest
29386 RemoteMavenServer36
30095 Jps
jinfo -flag UseParallelGC 29764
+号表示当前项目使用 ParallelGC
-XX:+UseParallelGC  
jinfo -flag UseParallelOldGC 29764
+号表示当前项目使用 ParallelOldGC
-XX:+UseParallelOldGC
jinfo -flag UseG1GC 29764
-号表示当前项目没有使用 G1GC
-XX:-UseG1GC

4、自定义垃圾回收器

-XX:+PrintCommandLineFlags
image.png
-XX:InitialHeapSize=134217728 -XX:MaxHeapSize=2147483648 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
-XX:+PrintCommandLineFlags -XX:+UseSerialGC
image.png
-XX:InitialHeapSize=134217728 -XX:MaxHeapSize=2147483648 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseSerialGC

四、Serial回收器:串行回收

image.png

五、ParNew回收器:并行回收

六、Parallel回收器:吞吐量优先

参数配置

七、CMS回收器:低延迟

CMS的工作原理

CMS整个过程比之前的收集器要复杂,整个过程分为4个主要阶段,即:初始标记阶段、并发标记阶段、重新标记阶段和并发清除阶段

1、初始标记(Initial-Mark)阶段
2、并发标记(ConCurrent-Mark)阶段
3、重新标记(Remark)阶段
4、并发清除(Concurrent-Sweep)阶段
小结

CMS有点

CMS缺点

CMS收集器参数设置

上一篇 下一篇

猜你喜欢

热点阅读