• 还在为学不会JVM&G1烦恼吗?看阿里P8源码分析笔记,你想要的都有


    写在前面

    G1是目前最成熟的垃圾回收器,已经广泛应用在众多公司的生产环境中。我们知道,CMS作为使用最为广泛的垃圾回收器,也有令人头疼的问题,即如何对其众多的参数进行正确的设置。G1的目标就是替代CMS,所以在设计之初就希望降低程序员的负担,减少人工的介人。但这并不意味着我们完全不需要了解G1的原理和参数调优。

    相信很多朋友们在实际工作中,遇到过一些因参数设置不正确而导致GC停顿时间过长的问题。但要正确设置参数并不容易,这里涉及两个方面:第一,需要对G1的原理熟悉,只有熟悉G1的原理才知道调优的方向;第二,能分析和解读G1运行的日志信息,根据日志信息找到G1运行过程中的异常信息,并推断哪些参数可以解决这些异常。

    看到这里,是不是感觉G1学习起来很有难度?不用担心,在这里笔者为大家带来一篇阿里P8级大佬整理的JVM&G1源码解析和调优的秘籍,希望能够帮到大家~~~

    主要内容

    本篇尝试从G1的原理出发,系统地介绍新生代回收、混合回收、Full GC、并发标记、Refine 线程等内容;同时依托于jdk8u的源代码介绍Hotspot如何实现G1,通过对源代码的分析来了解G1提供了哪些参数、这些参数的具体意义;最后还设计了一些示例代码,给出了G1在运行这些示例代码时的日志,通过日志分析来尝试调整参数并达到性能优化,还分析了参数调整可能带来的负面影响。

    • G1中涉及的基本概念,如分区、卡表、根集合、线程栈等。
    • G1是如何分配对象的,包括TLAB和慢速分配,以及在实践中参数调优的经验。
    • G1 Refine线程原理和参数调优。
    • G1如何进行新生代回收,包括对象标记、复制、分区释放等详细过程。
    • G1的并发标记算法和步骤,以及对参数调优进行了综合分析。
    • G1的串行FGC和JDK 10之后的并行FGC算法。
    • G1和其他垃圾回收器的比较,以及下一代垃圾回收器:JDK 11中引入的ZGC和JDK 12中引入的Shenandoah。

    第1章:垃圾回收概述

    • 1.1 Java发展概述
    • 1.2 本书常见术语
    • 1.3 回收算法概述
    • 1.4 JVM垃圾回收器概述

    第1章介绍垃圾回收的发展及使用的算法,同时还介绍一些重要并常见的术语。该章的知识不仅仅限于本篇介绍的G1,对于研读JVM文章或者JVM源码都有帮助。


    第2章:G1的基本概念

    • 2.1 分区
    • 2.2 G1停顿预测模型
    • 2.3 卡表和位图
    • 2.4 对象头
    • 2.5 内存分配和管理
    • 2.6 线程
    • 2.7 日志解读
    • 2.8 参数介绍和调优

    第2章介绍G1中的基本概念,包括分区、卡表、根集合、线程栈等和垃圾回收相关的基本知识点。


    第3章:G1的对象分配

    • 3.1 对象分配概述
    • 3.2 快速分配
    • 3.3 慢速分配
    • 3.4 G1 垃圾回收的时机
    • 3.5 参数介绍和调优

    第3章介绍G1是如何分配对象的,包括TLAB和慢速分配,G1的对象分配和其他垃圾回收器的对象分配非常类似,只不过在分配的时候以分区为基础,除此之外没有额外的变化,所以该章知识不仅仅适用于G1也适用于其他垃圾回收器,最后介绍了参数调优,同样也适用于其他的垃圾回收器。


    第4章:G1的Refine线程

    • 4.1 记忆集
    • 4.2 Refine 线程的功能及原理
    • 4.3 Refinement Zone
    • 4.4 RSet 涉及的写屏障
    • 4.5 日志解读
    • 4.6 参数介绍和调优

    第4章介绍G1 Refine线程,包括G1如何管理和处理代际引用,从而加快垃圾回收速度,介绍了Refinement 调优涉及的参数;虽然CMS也有卡表处理代际引用,但是G1的处理和CMS并不相同,Refine 线程是G1新引入的部分。


    第5章:新生代回收

    • 5.1 YGC算法概述
    • 5.2 YGC代码分析
    • 5.3 YGC 算法演示
    • 5.4 日志解读
    • 5.5参数介绍和调优

    第5章介绍新生代回收,包括G1如何进行新生代回收,包括对象标记、复制、分区释放等细节,还介绍了新生代调优涉及的参数。


    第6章:混合回收

    • 6.1 并发标记算法详解
    • 6.2 并发标记算法的难点
    • 6.3 G1中混合回收的步骤
    • 6.4 混合回收中并发标记处理的线程
    • 6.5 并****发标****记算法演示
    • 6.6 GC活动图
    • 6.7 日志解读
    • 6.8 参数优化

    第6章介绍混合回收。主要介绍G1的并发标记算法及其难点,以及G1中如何解决这个难点,同时介绍了并发标记的步骤:并发标记、Remark (再标记)和清理阶段;最后还介绍了并发标记的调优参数。


    第7章:Full GC

    • 7.1 Evac失败
    • 7.2 串行FGC
    • 7.3 并行FGC
    • 7.4 日志解读
    • 7.5 参数介绍和调优

    第7章介绍FullGC。在G1中,FullGC对整个堆进行垃圾回收,该章介绍G1的串行FullGC和JDK10之后的并行FullGC算法。


    第8章:G1中的引用处理

    • 8.1 引用概述
    • 8.2 可回收对象发现
    • 8.3 在GC时的处理发现列表
    • 8.4 重新激活可达的引用
    • 8.5 日志解读
    • 8.6 参数介绍和调优

    第8章介绍垃圾回收过程中如何处理引用,该功能不是G1独有的,也适用于其他垃圾回收器。


    第9章:G1的新特性——字符串去重

    • 9.1 字符串去重概述
    • 9.2 日志解读
    • 9.3 参数介绍和调优
    • 9.4 字符串去重和String.intern的区别
    • 9.5 String.intern中的实现

    第9章介绍G1的新特性:字符串去重。根据OpenJDK的官方文档,该特性可平均节约内存13%左右,所以这是一个非常有用的特性,值得大家尝试和使用。另外,该特性和JDK中String类的intern方法有一些类似的地方, 所以该章还比较了它们之间的不同。


    第10章:线程中的安全点

    • 10.1 安全点的基本概念
    • 10.2 G1 并发线程进入安全点
    • 10.3 解释线程进入安全点
    • 10.4 编译线程进入安全点
    • 10.5 正在执行本地代码的线程进入安全点
    • 10.6 安全点小结
    • 10.7 日志分析
    • 10.8 参数介绍和调优


      ]

    第10章介绍线程中的安全点。安全点在实际调优中涉及的并不多,所以很多人并不是特别熟悉。实际上,垃圾回收发生时,在进入安全点中做了不少的工作,而这些工作基本上是串行进行的,这些事情很有可能导致垃圾回收的时间过长。该章除了介绍如何进入安全点之外,还介绍了在安全点中做的一些回收工作,以及当发现它们导致GC过长时该如何调优。


    第11章:垃圾回收器的选择

    • 11.1 如何衡量垃圾回收器
    • 11.2 G1调优的方向

    第11章介绍如何选择垃圾回收器,以及选择G1遇到问题需要调优时我们该如何下手。该章属于理论性的指导,在实际工作中需要根据本书提到的参数正面影响和负面影响综合考虑,并不断调整。


    第12章:新一代垃圾回收器

    • 12.1 Shenandoah
    • 12.2 ZGC

    第12章介绍了下一代垃圾回收器Shenandoah和ZGC。G1作为发挥重要作用的垃圾回收器仍有不足之处,因此未来的垃圾回收器仍会继续发展,该章介绍了下一代垃圾回收器Shenandoah和ZGC对G1的改进之处及其工作原理。


    乍听起来,G1非常复杂,应该会有很多的参数。实际上在JDK8的G1实现中,一共新增了93个参数,其中开发参数(develop)有41个,产品参数( product)有31个,诊断参数( diagnostic)有9个,实验参数( experimental)有12个。开发参数需要在调试版本中才能进行验证(本篇只涉及个别参数),其余的三类参数都可以在发布版本中打开、验证和使用。

    本篇除了几个用于验证的诊断参数外,覆盖了发布版本中涉及的所有参数,为大家理解G1以及调优G1提供了帮助。

  • 相关阅读:
    Qt 信号与槽
    python中matrix()矩阵和array()数组(待完善)
    【Python】解析CPP类定义代码,获取UML类图信息
    边缘计算网关在智能工业园区中的的应用及其优势-天拓四方
    Win10怎么禁止自动安装软件
    【无标题】
    【毕业设计】深度学习YOLOv5车辆颜色识别检测 - python opencv
    centos常用命令大全
    系统架构师第一部分——架构设计基础
    适用于Windows电脑的最佳数据恢复软件是哪些?10佳数据恢复软件
  • 原文地址:https://blog.csdn.net/LBWNB_Java/article/details/126904939