首页 > 代码库 > 看懂gc日志

看懂gc日志

使用的是:+PrintGCDetails -XX:+PrintGCTimeStamps

 

输出的日志格式:

 [Times: user=0.03 sys=0.00, real=0.01 secs]
363.375: [GC 363.375: [ParNew: 39424K->3249K(39424K), 0.0054790 secs] 
69520K->37044K(126848K), 0.0055800 secs]

8.672: [Full GC 8.673: [Tenured: 26086K->30073K(87424K), 0.2213960 secs] 54718K->30073K(126848K), 
[Perm : 37565K->37565K(37568K)], 0.2214900 secs] [Times: user=0.32 sys=0.01, real=0.23 secs] 
  1. [GC][Full GC] 是垃圾回收的停顿类型,而不是区分是新生代还是年老代。
  2. [Full GC] 说明发生了 Stop-The-World 。如果是调用 System.gc() 触发的,那么将显示的是 [Full GC (System)
  3. 【ParNew】,【DefNew】 , 【Tenured】 , 【Perm】: 表示 GC 发生的区域,区域的名称与使用的 GC 收集器相关。
  • 【DefNew】:Serial 收集器中新生代名为 "Default New Generation"。
  • 【ParNew】: “Parallel New Generation”。
  • 【PSYoungGen】:对于 Parallel Scavenge 收集器,新生代名为 "PSYoungGen"。
  • 年老代和永久代也相同,名称都由收集器决定。

 

  4. 收集大小的影响:

  • ParNew: 39424K->3249K(39424K) 表示 “GC 前该区域已使用容量 -> GC 后该区域已使用容量 (该区域内存总容量) ”。
  • 69520K->37044K(126848K)”(方括号外) 表示 “GC 前Java堆已使用容量 -> GC后Java堆已使用容量 (Java堆总容量)”。

5. 花费时间: “0.0055800secs” 表示该区域GC所用时间,单位是

6. [Times: user=0.32 sys=0.01, real=0.23 secs]

  • user: 用户态消耗的CPU时间、
  • sys:内核态消耗的CPU时间 
  • real: 操作从开始到结束所经过的墙钟时间。墙钟时间包括各种非运算的等待耗时,如IO等待、线程阻塞。CPU时间不包括等待时间,当系统有多核时,多线程操作会 叠加这些CPU时间,所以user或sys时间会超过real时间。