JVM参数配置
一、Trace跟踪参数:
1、打印GC的简要信息:
配置详解:
首先在idea的run选项卡中找到edit configurations。
在下图中的VM options中填写如下参数:
-verbose:gc
-XX:+PrintGC
在测试代码中加入一句并运行:
System.gc();
解释:这里是说,GC之前用了4M左右内存,GC后用了0.7M左右。
2、打印GC的详细信息:
-XX:+PrintGCDetails
Heap PSYoungGen total 38400K, used 14248K [0x00000000d5f00000, 0x00000000d8980000, 0x0000000100000000) eden space 33280K, 42% used [0x00000000d5f00000,0x00000000d6cea288,0x00000000d7f80000) from space 5120K, 0% used [0x00000000d8480000,0x00000000d8480000,0x00000000d8980000) to space 5120K, 0% used [0x00000000d7f80000,0x00000000d7f80000,0x00000000d8480000) ParOldGen total 87552K, used 0K [0x0000000081c00000, 0x0000000087180000, 0x00000000d5f00000) object space 87552K, 0% used [0x0000000081c00000,0x0000000081c00000,0x0000000087180000) Metaspace used 3212K, capacity 4496K, committed 4864K, reserved 1056768K class space used 349K, capacity 388K, committed 512K, reserved 1048576K
PSYoungGen:Paralle Scavenge(年轻代)
3、打印GC的时间戳:
-XX:+PrintGCTimeStamps
理解GC日志的含义:
例如下面这段日志:
[GC[DefNew: 4416K->0K(4928K), 0.0001897 secs] 4790K->374K(15872K), 0.0002232 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
上方日志的意思是说:这是一个新生代的GC。方括号内部的“4416K->0K(4928K)”含义是:“GC前该内存区域已使用容量->GC后该内存区域已使用容量(该内存区域总容量)”。而在方括号之外的“4790K->374K(15872K)”表示“GC前Java堆已使用容量->GC后Java堆已使用容量(Java堆总容量)”。
再往后看,“0.0001897 secs”表示该内存区域GC所占用的时间,单位是秒。
-XX:+PrintHeapAtGC
-XX:+TraceClassLoading
[Loaded jvmTest1 from file:/I:/IdeaProjects/LeetCode/out/production/JVMTest/] [Loaded sun.launcher.LauncherHelper$FXHelper from C:\Program Files\Java\jdk1.8.0_191\jre\lib\rt.jar] [Loaded java.lang.Class$MethodArray from C:\Program Files\Java\jdk1.8.0_191\jre\lib\rt.jar] [Loaded java.lang.Void from C:\Program Files\Java\jdk1.8.0_191\jre\lib\rt.jar] [Loaded java.lang.Shutdown from C:\Program Files\Java\jdk1.8.0_191\jre\lib\rt.jar] [Loaded java.lang.Shutdown$Lock from C:\Program Files\Java\jdk1.8.0_191\jre\lib\rt.jar]
-Xmx1024m -Xms1024m
Xmx=981.5M
free mem=959.1398468017578M
total mem=981.5M
byte[] b = new byte[100 * 1024 * 1024]; System.out.println("分配了100M空间给数组"); System.out.println("Xmx=" + Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M"); //系统的最大空间 System.out.println("free mem=" + Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M"); //系统的空闲空间 System.out.println("total mem=" + Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M");
分配了100M空间给数组 Xmx=981.5M free mem=866.1399383544922M total mem=981.5M