JVM垃圾回收篇(扩展知识)

1.垃圾收集日志分析参数

  • -XX:+PrintGC

    用于输出简要的GC日志信息

    请添加图片描述

    • GC、Full GC代表GC的类型
    • Allocation Failure代表GC触发的原因,这里是由于空间不足分配失败导致的GC
    • 15339K - > 13878K代表堆空间在GC前的大小和GC后的大小
    • 58880k代表当前堆空间的总大小
    • 0.0039300 secs代表本次GC耗费的时间
  • -XX:+PrintGCDetails

    用于输出详细的GC日志信息

    请添加图片描述

    • PSYoungGen代表使用了Parallel Scavenge并行垃圾收集器的新生代GC前后大小的变化
    • ParOldGen代表使用了Parallel Old并行垃圾收集器的老年代GC前后大小的变化
    • Metaspace代表元数据区GC前后大小的变化
    • Time中,user代表垃圾收集器花费的所有CPU时间、sys代表等待系统调用或系统事件的时间、real代表GC从开始到结束的总体时间
  • -XX:+PrintGCTimeStamps

    用于输出GC日志信息的时间(时间戳格式)

    请添加图片描述

  • -XX:+PrintGCDateStamps

    用于输出GC日志信息的时间(日期格式)

    请添加图片描述

  • -XX:+PrintHeapAtGC

    用于在进行GC的前后打印出堆的信息

  • -Xloggc:/logs/gc.log

    用于输出GC日志信息到文件

2.垃圾收集日志分析示例

请添加图片描述

请添加图片描述

/**
 * -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[] agrs) {
        testAllocation();
    }
}

JDK7中

请添加图片描述
请添加图片描述
请添加图片描述

JDK8中

请添加图片描述

3.垃圾收集日志分析工具

  • GCViewer
  • GCEasy
  • GCHisto
  • GCLogViewer
  • Hpjmeter
  • GarbageCat

4.现代垃圾收集器发展

  • 在Oracle JDK11中,推出 Epsilon 垃圾回收器,号称无操作回收器,也就是只做内存的分配不做回收

  • 在Open JDK12中,推出 Shenandoah 垃圾回收器

    • 它是第一款不由Oracle公司团队领导开发的HotSpot垃圾收集器

    • 它是由RedHat进行的一项垃圾收集器研究项目PauselessGC的实现,旨在针对JVM上的内存回收实现低停顿的需求,并在2014年贡献给OpenJDK

    • Red Hat研发Shenandoah的团队宣称,Shenandoah垃圾回收器的暂停时间与堆大小无关,这意味着无论将堆设置为200MB还是200GB,99.9%的目标都可以把垃圾收集的停顿时间限制在十毫秒以内。不过实际使用性能将取决于实际工作堆的大小和工作负载

    • 优点: 低延迟时间;缺点: 高运行负担下的吞吐量下降
      请添加图片描述

  • ZGC

    • ZGC与Shenandoah目标高度相似,在尽可能对吞吐量影响不大的前提下,实现在任意堆内存大小下都可以把垃圾收集的停顿时间限制在十毫秒以内的低延迟

    • ZGC的工作过程可以分为4个阶段:并发标记、并发预备重分配、并发重分配、并发重映射

    • ZGC几乎在所有地方并发执行的,除了初始标记的是STW的,所以停顿时间几乎就耗费在初始标记上,这部分的实际时间是非常少的

    • ZGC在JDK14中,推出了能够在MacOS和Windows中使用,可以使用参数 -XX:+Unloc kExperimentalVMOptions 和参数 -XX:+UseZGC 开启ZGC
      请添加图片描述

  • AliGC

    AliGC是阿里巴巴JVM团队基于G1算法,主要面向大堆的应用场景
    请添加图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程小吉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值