理解GC
java虚拟机规范没有对垃圾收集器的实现做出具体要求,因此垃圾收集器有着很多种类,每一种垃圾收集器的日志形式都是由它们自身的实现所决定,每一种日志格式都可以不一样,但是虚拟机设计者为了方便用户阅读,将各个收集器的日志都维持一定的共性。
典型的GC日志:
- 最前面的数字 “33.125”和“100.67”代表了GC发生的时间,是从Java虚拟机启动以来经过的秒数
- GC日志开头的
GC
和Full GC
说明这次垃圾收集的停顿类型,而不是用来区分新生代GC和老年代GC的。- Full代表这次GC是发生了 Stop The World的
- DefNew、Tenured、Perm等表示GC发生的区域
- 对于Serial收集器,新生代名为 Default New Generation,所以显示的DefNew
- 而对于ParNew收集器,新生代就会变成 ParNew,意思是 Parallel New Generation
- 而Parallel Scavenge收集器的新生代称为 PSYoungGen
- Tenured是老年代
- 对于Serial收集器,新生代名为 Default New Generation,所以显示的DefNew
- 方括号内部的
3324K -> 152K(3712K)
的含义是 GC前该区域已使用容量->GC后该内存区域已使用容量(该内存区域总容量)。而方括号之外的3324K->152K(11904K)
表示“GC前Java堆已使用容量 -> GC后Java堆已使用容量(Java堆总容量)” 0.0025925 secs
表示该内存区域GC所占用的时间,单位是秒。 有的收集器会给出更具体的时间数据:- 如
[Times:user=0.01 sys=0.00 , real=0.02 secs]
,这里面的user、sys和real与Linux 的time命令所输出的时间含义一致,分别代表用户态消耗的CPU时间,内核态消耗的CPU时间,操作从开始到结束所经过的墙钟时间(Wall Clock Time)。 - 墙钟时间包括各种非运算的等待耗时,例如等待磁盘I/O、等待线程阻塞,而CPU时间不包括这些耗时,但当系统有多CPU或者多核的话,多线程操作会叠加这些CPU时间,所以读者看到user或sys时间超过real时间是完全正常的。
- 如
参考
- 本文作者: xczll
- 本文链接: https://xczllgit.github.io/2020/03/27/jvm/2020-03-27-gcLog/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!