理解Java GC日志
idea 在vm options处加入-XX:+PrintGCDetails,可打印GC日志。
1 public class ReferenceCountingGC { 2 3 public Object instance=null; 4 5 private static final int _1MB=1024*1024; 6 7 private byte[] bigSize=new byte[2*_1MB]; 8 9 public static void testGC(){ 10 ReferenceCountingGC objA=new ReferenceCountingGC(); 11 ReferenceCountingGC objB=new ReferenceCountingGC(); 12 objA.instance=objB; 13 objB.instance=objA; 14 15 objA=null; 16 objB=null; 17 18 System.gc(); 19 } 20 21 public static void main(String[] args) { 22 testGC(); 23 } 24 25 }
打印GC日志为:
[GC (Allocation Failure) [DefNew: 3762K->512K(4928K), 0.0044320 secs] 3762K->2609K(15872K), 0.0171251 secs] [Times: user=0.00 sys=0.00, real=0.02 secs]
[Full GC (System.gc()) [Tenured: 2097K->560K(10944K), 0.0031949 secs] 4657K->560K(15872K), [Metaspace: 2131K->2131K(4480K)], 0.0036546 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
def new generation total 4992K, used 91K [0x04800000, 0x04d60000, 0x09d50000)
eden space 4480K, 2% used [0x04800000, 0x04816d20, 0x04c60000)
from space 512K, 0% used [0x04c60000, 0x04c60000, 0x04ce0000)
to space 512K, 0% used [0x04ce0000, 0x04ce0000, 0x04d60000)
tenured generation total 10944K, used 560K [0x09d50000, 0x0a800000, 0x14800000)
the space 10944K, 5% used [0x09d50000, 0x09ddc140, 0x09ddc200, 0x0a800000)
Metaspace used 2149K, capacity 2280K, committed 2368K, reserved 4480K
——————————————————————————————————————
“[GC” 说明垃圾收集的停顿类型。
“[Full GC”说明这次GC发生了Stop-The-World。此处是调用了System.gc()所触发的收集。
“[DefNew”、“[Tenured”表示GC发生的区域。Default New Generation。
“3762K->512K(4928K)”表示GC前该内存区域已使用容量->GC后该区域已使用容量(该内存区域总容量)。
“3762K->2609K(15872K)”表示GC前java堆已使用容量->GC后java堆已使用容量(java堆总容量)。
“0.0171251 secs”表示该内存区域GC所占用的时间,单位是秒。
“[Times: user=0.00 sys=0.00, real=0.02 secs] ”表示用户态消耗的CPU时间,内核态消耗的CPU事件,操作从开始到结束所经过的墙钟时间(包括各种非运算的等待耗时)。
“tenured generation”老年代
“the space 10944K, 5% used”表示老年区的内存大小是10944K,5%被使用。
“Metaspace” Java8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代。