查看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版权协议,转载请附上原文出处链接和本声明。