对于java程序员来说,理解GC日志才能更好地分析程序运行时垃圾回收状况,以及更好地调整jvm参数使程序长期更稳定地运行。
理解GC日志
http://book.51cto.com/art/201306/399236.htm 该文是周志明编写的《深入理解JAVA虚拟机》中的一节内容,较详细地说明了GC日志的格式,以及如何解读。
33.125: [GC [DefNew: 3324K->152K(3712K), 0.0025925 secs] 3324K->152K(11904K),
0.0031680 secs]
100.667: [Full GC [Tenured: 0K->210K(10240K), 0.0149142 secs] 4603K->210K(19456K),
[Perm : 2999K->2999K(21248K)], 0.0150007 secs]
[Times: user=0.01 sys=0.00, real=0.02 secs]
上面一段GC日志的内容,如果你能在不找相关资料的情况下,自己进行解读,那么就可以认为基本掌握了如何理解GC日志。
不同的垃圾收集器,对应的gc日志中对新生代与老年代的称呼也不一样。以下是一份小结
收集器 | 新生代 | 老年代 |
---|---|---|
Parallel Scavenge | PSYongGen | ParOldGen |
Serial | Default New Generation 简称DefNew | |
ParNew | Parallel New Generation 简称ParNew | |
Serial Old | Tenured | |
Parallel Old | ParOldGen |
案例
// gc类型为GC, 触发gc的原因是执行了System.GC()
// 新生代gc之前占用内存3965k,gc之后560k,新生代内部总共76288k
// 堆内存gc之前占用内存3965k,gc之后568k,堆内存总共251392k
[GC (System.gc())
[PSYoungGen: 3965K->560K(76288K)] 3965K->568K(251392K), 0.0020730 secs
]
[Times: user=0.01 sys=0.00, real=0.00 secs]
//gc类型为Full GC,触发full gc的原因是执行了System.GC()
//新生代gc之前占用内存560k,gc之后0k,新生代内部总共76288k
//老年代gc之前占用内存8k,gc之后占用397k,老年代总内存175104k
//堆内存gc之前568k,gc之后397k,堆内存总共251392k
//元空间gc情况,分析类似
[Full GC (System.gc())
[PSYoungGen: 560K->0K(76288K)]
[ParOldGen: 8K->397K(175104K)] 568K->397K(251392K),
[Metaspace: 3129K->3129K(1056768K)], 0.0043673 secs
]
[Times: user=0.01 sys=0.01, real=0.00 secs]
Heap
PSYoungGen total 76288K, used 1966K [0x000000076ab00000, 0x0000000770000000, 0x00000007c0000000)
eden space 65536K, 3% used [0x000000076ab00000,0x000000076aceba38,0x000000076eb00000)
from space 10752K, 0% used [0x000000076eb00000,0x000000076eb00000,0x000000076f580000)
to space 10752K, 0% used [0x000000076f580000,0x000000076f580000,0x0000000770000000)
ParOldGen total 175104K, used 397K [0x00000006c0000000, 0x00000006cab00000, 0x000000076ab00000)
object space 175104K, 0% used [0x00000006c0000000,0x00000006c00635c8,0x00000006cab00000)
Metaspace used 3136K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 344K, capacity 388K, committed 512K, reserved 1048576K
Process finished with exit code 0