JVM的GC日志分析

查看GC日志

第一种

package thread;

public class JvmGcTest {
    public static void main(String[] args) {
        byte[] data = new byte[1024 * 1024];
        // 将data置为null即让它成为垃圾
        data = null;
        // 通知垃圾回收器回收垃圾
        System.gc();
    }
}

jvm参数配置
在这里插入图片描述
执行结果
在这里插入图片描述

第二种

在工程的bin层打开cmd 输入命令:java -XX:+PrintGCDetails JvmGcTest
在这里插入图片描述

GC日志参数

-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径

分析日志

"C:\Program Files\Java\jdk1.8.0_31\bin\java.exe" -XX:+PrintGCDetails "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3\lib\idea_rt.jar=64972:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_31\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_31\jre\lib\rt.jar;D:\workspace\mytest-java\target\classes;D:\MAVEN_SPACE\com\jd\jstp-octopus-export\1.1.0-SNAPSHOT\jstp-octopus-export-1.1.0-20210927.104421-5.jar;D:\MAVEN_SPACE\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar" thread.JvmGcTest
[GC (System.gc()) [PSYoungGen: 6226K->840K(75776K)] 6226K->848K(249344K), 0.0009947 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (System.gc()) [PSYoungGen: 840K->0K(75776K)] [ParOldGen: 8K->755K(173568K)] 848K->755K(249344K), [Metaspace: 3164K->3164K(1056768K)], 0.0039649 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap
 PSYoungGen      total 75776K, used 1951K [0x000000076bf80000, 0x0000000771400000, 0x00000007c0000000)
  eden space 65024K, 3% used [0x000000076bf80000,0x000000076c167c68,0x000000076ff00000)
  from space 10752K, 0% used [0x000000076ff00000,0x000000076ff00000,0x0000000770980000)
  to   space 10752K, 0% used [0x0000000770980000,0x0000000770980000,0x0000000771400000)
 ParOldGen       total 173568K, used 755K [0x00000006c3e00000, 0x00000006ce780000, 0x000000076bf80000)
  object space 173568K, 0% used [0x00000006c3e00000,0x00000006c3ebccd8,0x00000006ce780000)
 Metaspace       used 3189K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 346K, capacity 388K, committed 512K, reserved 1048576K

通过上面日志分析得出,PSYoungGen、ParOldGen、PSPermGen属于Parallel收集器。其中PSYoungGen表示gc回收前后年轻代的内存变化;ParOldGen表示gc回收前后老年代的内存变化;PSPermGen表示gc回收前后永久区的内存变化。young gc 主要是针对年轻代进行内存回收比较频繁,耗时短;full gc 会对整个堆内存进行回收,耗时长,因此一般尽量减少full gc的次数。

young gc 日志:
在这里插入图片描述
Full GC日志:
在这里插入图片描述


版权声明:本文为xiaowanzi_zj原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。