我们在 linux 服务器上有一个 Glassfish 服务器,它开启了 verbose:gc,输出在 gc.log 文件中。
我们使用 flag -XX:+PrintGCDetails
。生成的文件包含这样的行:
14.796: [GC [PSYoungGen: 432125K->45845K(454336K)] 537435K->153491K(624832K), 0.0304470 secs] [Times: user=0.12 sys=0.01, real=0.02 secs]
15.337: [GC [PSYoungGen: 269819K->25031K(464768K)] 377465K->154113K(635264K), 0.0361400 secs] [Times: user=0.10 sys=0.01, real=0.03 secs]
15.373: [Full GC (System) [PSYoungGen: 25031K->0K(464768K)] [PSOldGen: 129081K->123718K(170496K)] 154113K->123718K(635264K) [PSPermGen: 92038K->92038K(184384K)], 0.3855460 secs]
如您所见,最后一行不包含该[Times: ...]
部分。GC 事件行并没有完全写入日志文件,因为当下一次 GC 事件发生时,[Times: ...]
前一行的一部分被写入,然后另一部分行被写入,给我们这样的东西:
14.796: [GC [PSYoungGen: 432125K->45845K(454336K)] 537435K->153491K(624832K), 0.0304470 secs] [Times: user=0.12 sys=0.01, real=0.02 secs]
15.337: [GC [PSYoungGen: 269819K->25031K(464768K)] 377465K->154113K(635264K), 0.0361400 secs] [Times: user=0.10 sys=0.01, real=0.03 secs]
15.373: [Full GC (System) [PSYoungGen: 25031K->0K(464768K)] [PSOldGen: 129081K->123718K(170496K)] 154113K->123718K(635264K) [PSPermGen: 92038K->92038K(184384K)], 0.3855460 secs] [Times: user=0.38 sys=0.01, real=0.39 secs]
3617.352: [GC [PSYoungGen: 431872K->8052K(439936K)] 585800K->161981K(718144K), 0.0085710 secs]
由于该行未完成,因此不存在回车符,因此该行不会显示在诸如之类的工具中multitail
使用-XX:+PrintGC
标志,我们不再有这个问题。但由于我们需要完整的细节,这不是一个好的解决方案。
JVM 版本,在 linux 上运行:
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
所以问题是:是否可以强制 JVM 写入日志行(一种刷新技巧)?或者是否可以在没有最后一部分的情况下获得 GC 详细信息?