Day361.分析GC日志 -JVM

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day361.分析GC日志 -JVM相关的知识,希望对你有一定的参考价值。

分析GC日志

一、GC日志参数


二、GC日志格式

1、复习:GC分类

1、新生代收集:当Eden区满的时候就会进行新生代收集,所以新生代收集和S0区域和S1区域无关

2、老年代收集和新生代收集的关系:进行老年代收集之前会先进行一次年轻代的垃圾收集,原因如下:一个比较大的对象无法放入新生代,那它自然会往老年代去放,如果老年代也放不下,那会先进行一次新生代的垃圾收集,之后尝试往新生代放,如果还是放不下,才会进行老年代的垃圾收集,之后在往老年代去放,这是一个过程,我来说明一下为什么需要往老年代放,但是放不下,而进行新生代垃圾收集的原因,这是因为新生代垃圾收集比老年代垃圾收集更加简单,这样做可以节省性能

3、进行垃圾收集的时候,堆包含新生代、老年代、元空间/永久代:可以看出Heap后面包含着新生代、老年代、元空间,但是我们设置堆空间大小的时候设置的只是新生代、老年代而已,元空间是分开设置的

哪些情况会触发Full GC

老年代空间不足、方法区空间不足、显示调用System.gc()、Minior GC进入老年代的数据的平均大小 大于 老年代的可用内存、大对象直接进入老年代,而老年代的可用空间不足


2、不同GC分类的GC细节

可以通过日志,来判断你使用的是什么垃圾回收器

/**
 *  -XX:+PrintCommandLineFlags
 *
 *  -XX:+UseSerialGC:表明新生代使用Serial GC ,同时老年代使用Serial Old GC
 *
 *  -XX:+UseParNewGC:标明新生代使用ParNew GC
 *
 *  -XX:+UseParallelGC:表明新生代使用Parallel GC
 *  -XX:+UseParallelOldGC : 表明老年代使用 Parallel Old GC
 *  说明:二者可以相互激活
*
 *  -XX:+UseConcMarkSweepGC:表明老年代使用CMS GC。同时,年轻代会触发对ParNew 的使用
* @author shkstart
 * @create 17:19
 */
public class GCUseTest {
    public static void main(String[] args) {
        ArrayListbyte[]> list = new ArrayList();

        while(true){
            byte[] arr = new byte[1024 * 10];//10kb
            list.add(arr);
            //            try {
            //                Thread.sleep(5);
            //            } catch (InterruptedException e) {
            //                e.printStackTrace();
            //            }
        }
    }
}
  • 老年代使用CMS GC

GC设置方法:参数中使用-XX:+UseConcMarkSweepGC,说明老年代使用CMS GC,同时年轻代也会触发对ParNew的使用,因此添加该参数之后,新生代使用ParNew GC,而老年代使用CMS GC,整体是并发垃圾收集,主打低延迟

打印出来的GC细节:


  • 新生代使用Serial GC

GC设置方法:参数中使用-XX:+UseSerialGC,说明新生代使用Serial GC,同时老年代也会触发对Serial Old GC的使用,因此添加该参数之后,新生代使用Serial GC,而老年代使用Serial Old GC,整体是串行垃圾收集

打印出来的GC细节:

DefNew代表新生代使用Serial GC,然后Tenured代表老年代使用Serial Old GC


3、GC日志分类

  • MinorGC

  • FullGC


4、GC日志结构剖析

  • 垃圾收集器

  • GC前后情况

  • GC时间


5、Minor GC 日志解析

  • 2020-11-20T17:19:43.265-0800
    • 添加-XX:+PrintGCDateStamps参数
  • 0.822:
    • 添加-XX:+PrintGCTimeStamps该参数
  • 76800K->8449K(294400K)
    • 虽然本次是Minor GC,只会进行新生代的垃圾收集,但是也肯定会打印堆中总容量相关信息

6、Full GC 日志解析

  • 2020-11-20T17:19:43.794-0800
    • 添加-XX:+PrintGCDateStamps参数
  • 1.351
    • 添加-XX:+PrintGCTimeStamps该参数

三、GC日志分析工具

-Xloggc:<你指定的路径>

  • GCEasy

    • gceasy.io
  • GCViewer

  • GChisto

    • 已经停止维护,有bug

以上是关于Day361.分析GC日志 -JVM的主要内容,如果未能解决你的问题,请参考以下文章

GC 日志分析工具 —— GChisto

GC日志分析

GC 分析

Java中GC (Allocation Failure)日志分析实战

GC 分析

Java中GC (Allocation Failure)日志分析实战