每一种收集器的日志形式都是由它们自身的实现所决定的,换而言之,每个收集器的日志格式都可以不一样。但虚拟机设计者为了方便用户阅读,将各个收集器的日志都维持一定的共性。
6.352: [GC Desired survivor size 100663296 bytes, new threshold 7 (max 15) [PSYoungGen: 589824K->96256K(688128K)] 589824K->96384K(1998848K), 0.3567250 secs] [Times: user=0.29 sys=0.11, real=0.45 secs]
...
587718.211: [Full GC [PSYoungGen: 244981K->0K(698368K)] [ParOldGen: 830852K->320886K(1310720K)] 1075834K->320886K(2009088K) [PSPermGen: 110550K->107957K(262144K)], 3.9585670 secs] [Times: user=5.32 sys=0.00, real=3.96 secs]
GC发生的时间
最前面的数字“6.352”和“8.990”代表了GC发生的时间,这个数字的含义是从Java虚拟机启动以来经过的秒数。
垃圾收集的停顿类型
GC日志开头的“[GC”和“[Full GC”说明了这次垃圾收集的停顿类型,而不是用来区分新生代GC还是老年代GC的。如果有“Full”,说明这次GC是发生了Stop-The-World的。
GC发生的区域
接下来的“DefNew”、“[Tenured”、“[Perm”表示GC发生的区域,这里显示的区域名称与使用的GC收集器是密切关系的。
Serial收集器中的新生代名为“Default New Generation”,所以显示的是“[DefNew”。
ParNew收集器中新生代名为“Parallel New Generation”,所以显示的是"[ParNew]"。
Parallel Scavenge收集器,它配套的新生代称为“PSYoungGen”。
老年代和永久代同理,名称也是由收集器决定的。
GC内存相关信息
CPU时间与墙钟时间的区别是:墙钟时间包括各种非运算的等待耗时,例如等待磁盘I/O、等待线程阻塞,而CPU时间不包括这些耗时,但当系统有多CPU或者多核的话,多线程操作会叠加这些CPU时间,所以读者看到user或sys时间超过real时间是完全正常的。