可以通过-XX:+PrintGCDetails日志收集参数,告诉虚拟机在发生垃圾收集时打印内存回收日志,并在进程退出时输出当前内存的各区域分配情况。
2.766: [GC (Allocation Failure) 2.766: [DefNew: 61826K->7616K(68800K), 0.0313370 secs] 92247K->38390K(221760K), 0.0314264 secs] [Times: user=0.07 sys=0.00, real=0.03 secs]
2.766 - GC发生的时间,值为从虚拟机启动以来经过的秒数;
GC - 垃圾收集的类型,GC/Minor GC代表本次收集发生在年轻代,Major GC/Full GC代表本次收集发生在老年代,老年代GC速度一般比年轻代GC慢10倍以上;Full GC(system)代表程序调用system.gc()触发的收集;
Allocation Failure - 代表GC的原因是年轻代中没有足够的空间能够存储新的数据,Metadata GC Threshold代表永久代(从JDK8开始,使用Metaspace取代永久代的概念,Metaspace使用本地内存而不是堆内存)中没有足够的空间;
DefNew - 代表GC发生的区域,显示的名称与使用的收集器密切相关,DefNew为Serial收集器中的新生代名称;
61826K->7616K(68800K) - 代表该内存区域 GC前已使用容量->GC后已使用容量(总容量) ,单位为KB;
0.0313370 secs - 代表该内存区域GC耗时,单位为s;
92247K->38390K(221760K), 0.0314264 secs - 代表Java堆 GC前已使用容量->GC后已使用容量(总容量),GC耗时;
[Times: user=0.07 sys=0.00, real=0.03 secs] - 代表用户态消耗CPU的时间、内核态消耗CPU的时间、操作从开始到结束经历的墙钟时间(Wall Clock Time,包括I/O、线程阻塞等非运算等待耗时,CPU时间不包括等待耗时),系统为多CPU时,CPU时间会被多线程叠加,所以user或sys的时间超过real是正常的;