JVM学习笔记(14) 垃圾回收-垃圾回收器

一. GC分类与性能指标

在这里插入图片描述

垃圾回收器分类

按照线程数分

在这里插入图片描述
在这里插入图片描述

按照工作模式分

在这里插入图片描述

按照碎片处理方式或工作的内存区间分

在这里插入图片描述

评估GC的性能指标

在这里插入图片描述
在这里插入图片描述

吞吐量(throughput)

在这里插入图片描述

暂停时间(pause time)

在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


二.不同的垃圾回收器概述

在这里插入图片描述

垃圾收集器发展史

GC 可以是两个名词的缩写
Garbage Collection 垃圾回收
Garbage Collector 垃圾回收器

在这里插入图片描述

七款经典的垃圾回收器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七款经典收集器与垃圾分代之间的关系

在这里插入图片描述

垃圾回收器的组合关系

在JDK8 中默认是Parallel Scavenge GC + Parallel Old GC的组合
为啥Parallel Scavenge GC 和 ParNew GC 都是并行的垃圾回收器但是.Parallel Scavenge GC 却不能和CMS GC组合呢 ?
因为Parallel Scavenge GC 底层用的GC框架和其他的垃圾回收器不要用,所以不能进行兼容

在这里插入图片描述
在这里插入图片描述

不同的垃圾回收器概述

在这里插入图片描述

如何查看默认的垃圾收集器

-XX:+PrintCommandLineFlags

在这里插入图片描述

任意执行一个程序
-XX:InitialHeapSize=264819328 -XX:MaxHeapSize=4237109248 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
可以看出使用的是Parallel Scavenge GC
在这里插入图片描述
在这里插入图片描述

上面的是JDK8 的, 下面是切换到JDK9之后执行的结果
使用的就变成G1了
在这里插入图片描述
在这里插入图片描述


三.Serial回收器: 串行回收

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

-XX:InitialHeapSize=264819328 -XX:MaxHeapSize=4237109248 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC

/**
 * -XX:+PrintCommandLineFlags 
 * -XX:+PrintCommandLineFlags -XX:+UseSerialGC  指定使用的GC
 */
public class GCUseTest {

    public static void main(String[] args) throws InterruptedException {

        ArrayList<byte[]> list = new ArrayList<>();

        while (true) {
            byte[] arr = new byte[100];
            list.add(arr);
            Thread.sleep(10);
        }
    }
}

在这里插入图片描述


四.ParNew回收器 : 并行回收

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用parNew和CMSGC, 在JDK9中会报错
在这里插入图片描述


五.Parallel回收器: 吞吐量优先

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

查看使用的GC
在这里插入图片描述
在这里插入图片描述

使用MaxGCPauseMills时会动态调节堆内存的大小, 如果堆内存变小了,可能会导致GC的次数变多,GC次数变多了之后,可能会导致吞吐量下降,影响整体性能
在这里插入图片描述

这个参数是默认开启状态的,这就是为什么我们在实际查看新生代和老年代的比例时不是8:1的原因
在这里插入图片描述


六.CMS回收器: 低延迟

在这里插入图片描述在这里插入图片描述

CMS工作原理

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

CMS 收集器可以设置的参数

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

JDK后续版本中CMS的变化

在这里插入图片描述


七. G1 回收器: 区域化分代式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

G1回收器的特点(优势)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

G1回收器的缺点

在这里插入图片描述

G1回收器的参数设置

在使用MaxGCPauseMillis设置期望最大GC停顿时常的时候,如果设置的市场过于短了的话,可能会存在回收的速度比不上占用region的速度,导致内存占用率越来越高,并最终发生了Full GC ,得不偿失.反而导致性能下降了
GC时间在200-300ms差不多都是正常的时间段
在这里插入图片描述

G1回收器常见操作步骤

在这里插入图片描述

G1回收器的适用场景

在这里插入图片描述

分区Region: 化整为零

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

G1回收器垃圾回收过程

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

G1回收器垃圾回收过程: Remembered Set

在这里插入图片描述
在这里插入图片描述

G1回收过程一: 年轻代GC

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

G1回收过程二 : 并发标记过程

在这里插入图片描述

G1回收过程三: 混合回收

在这里插入图片描述
在这里插入图片描述

G1回收可选的过程四: Full GC

在这里插入图片描述

G1回收过程 : 补充

在这里插入图片描述

G1 回收器优化建议

在这里插入图片描述


八. 垃圾回收器总结

7种经典垃圾回收器总结

在这里插入图片描述
在这里插入图片描述

怎么选择垃圾回收器

在这里插入图片描述
在这里插入图片描述

面试

在这里插入图片描述


九. GC日志分析

在这里插入图片描述

Allocation Failure 分配失败
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

比如使用./logs/gc.log ,的话,需要在过程的根目录下建一个logs目录,然后每次执行的时候就会生成新的日志文件
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Minor GC 日志

在这里插入图片描述

Full GC 日志

在这里插入图片描述

perm -> 永久代或者原空间
在这里插入图片描述

举例

/**
 * 在jdk7 和 jdk8中分别执行
 *             设置堆内存大小    新生代大小                    新生代比例, 伊甸园区8份  使用串行垃圾回收器
 * -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+UseSerialGC
 */
public class GCLogTest1 {
    private static final int _1MB = 1024 * 1024;

    public static void testAllocation() {
        byte[] allocation1, allocation2, allocation3, allocation4;
        allocation1 = new byte[2 * _1MB];
        allocation2 = new byte[2 * _1MB];
        allocation3 = new byte[2 * _1MB];
        allocation4 = new byte[4 * _1MB];
    }

    public static void main(String[] args) {
        testAllocation();
    }

}

在JDK7中运行

由图可以看出来, 在分配内存的过程中,首先是把前面三个2MB的对象放入伊甸园区之后, 当需要进行存放第四个4MB的对象的时候,会发现新生代已经没有办法进行存放了,这个时候就触发了一次GC, 将原本的3个2M的对象都放到了老年代之中, 这个时候就可以将新的4M的对象放到伊甸园区中了,查看打印的GC日志可以查看.

在这里插入图片描述

可以看出新生代使用了4M的空间,而老年代则使用了6M的大小
在这里插入图片描述

在JDK8中运行

在JDK8中大对象直接放入了老年代中
在这里插入图片描述
在这里插入图片描述

GC日志分析工具

在这里插入图片描述

GC Viewer

下载地址
直接打开jar文件即可使用
在这里插入图片描述

GC Easy

在线地址 : GC Easy
在这里插入图片描述


十. 垃圾回收器的新发展

在这里插入图片描述

JDK11 新特性

参考网址 : JEP318
318 -> 无操作的垃圾回收器,只进行分配内存的操作,不进行垃圾的回收(分配完内存就退出了)
在这里插入图片描述

Open JDK12的Shenandoah GC

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ZGC – JDK14新特性

在线文档
在这里插入图片描述

在这里插入图片描述

左边: 低延迟优先的情况下的吞吐量
右边: 低延迟不保证优先的情况下的吞吐量
在这里插入图片描述

无论是平均停顿时间还是95% 或者最大的停顿时间,ZGC都可以保证停顿时间在10ms以内
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其他的垃圾回收器 – AliGC

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值