读懂GC日志
28 October 2013
为了充分利用垃圾收集,你需要经常看看子系统在做什么。除了基本的verbose:gc标记, 还有很多可以控制输出信息的选项。
不管怎 样,会读日志以及了解影响GC的基本选项非常重要,因为有时候你可能没法用GUI工具。最常用的GC日志选项如下所示:
选项 | 效果 |
---|---|
-XX:+PrintGCDetails | 关于GC更详细的细节 |
-XX:+PrintGCDateStamps | GC操作的时间戳 |
-XX:+PrintGCApplicationConcurrentTime | 在应用线程仍然运行的情况下用在GC上的时间 |
这些选项组合在一起时,会产生下面这种日志:
2013-10-28T14:01:39.884+0800: [GC [PSYoungGen: 297694K->43634K(305856K)]
297766K->50890K(1004928K), 0.2877270 secs]
[Times: user=0.34 sys=0.06, real=0.29 secs]
把它分解,看看每一部分是什么意思
<time>:[GC [<collector name>: <occupancy at start> -> <occupancy at start> (<total size>)]
<full heap occypancy at start> -> <full heap occupancy at end>(<total heap size>), <pause time> secs]
Times: user= sys, real 参见
第一块是GC的发生时间,从JVM启动开始算,到发生时的秒数。然后是用来收集年轻代的 收集器名称(PSYoungGen)。接着是年轻代收集前后占用的内存,以及年轻代的总大小。接着 是反映完全收集情况的相同部分。
除了GC日志选项,还有一个选项如果不经解释可能会引起误解。用选项-XX:+PrintGC- ApplicationStoppedTime产生的日志是这样的:
Application time: 7.0147610 seconds
这些并不一定指GC用了多长时间,而是指在一个从安全点开始的操作中,线程停了多长时间。这包括GC操作,但也包括其他安全点操作(比如Java 6中的偏向锁操作),所以没有十足把 握说这是指GC时长。
blog comments powered by Disqus