Java垃圾收集日志消息
我已经configuration了Java将垃圾收集信息转储到日志( verbose GC )。 我不确定日志中垃圾收集条目的含义。 这些条目的样本张贴在下面。 我在Google上search过 ,没有find明确的解释。
我有一些合理的猜测,但我正在寻找答案,提供严格的条目数字是什么意思,由可靠的来源支持的定义。 所有答案的自动+1引用sun文档。 我的问题是:
- PSYoungGen是指什么? 我认为这与前一代(年轻一代)有关,但究竟是什么?
- 数字的第二个三位数与第一个三位数的区别是什么?
- 为什么名字(PSYoungGen)为第一个三位数字指定,而不是第二个?
- 每个数字(内存大小)在三元组是什么意思。 例如在109884K-> 14201K(139904K)中,是GC 109884k之前的内存,然后减less到14201K。 第三个数字如何相关? 为什么我们需要第二组数字?
8109.128:[GC [PSYoungGen:109884K-> 14201K(139904K)] 691015K-> 595332K(1119040K),0.0454530secs]
8112.111:[GC [PSYoungGen:126649K-> 15528K(142336K)] 707780K-> 605892K(1121472K),0.0934560secs]
8112.802:[GC [PSYoungGen:130344K-> 3732K(118592K)] 720708K-> 607895K(1097728K),0.0682690sec]
大部分内容在“ GC调优指南”中都有解释(无论如何你都可以阅读)。
命令行选项
-verbose:gc
导致在每个集合上打印有关堆和垃圾回收的信息。 例如,以下是来自大型服务器应用程序的输出:[GC 325407K->83000K(776768K), 0.2300771 secs] [GC 325816K->83372K(776768K), 0.2454258 secs] [Full GC 267628K->83769K(776768K), 1.8479984 secs]
在这里,我们看到两个小集合,其次是一个主要集合。 箭头之前和之后的数字(例如,从第一行开始的
325407K->83000K
)分别表示垃圾收集之前和之后活物的组合大小。 在次要收集之后,大小包括一些垃圾对象(不再活着),但不能被回收。 这些对象要么被包含在时代中,要么从终身或永久的世代引用。括号中的下一个数字(例如,从第一行再次
(776768K)
)是堆的承诺大小:可用于java对象的空间量,而不需要从操作系统请求更多内存。 请注意,此数字不包含其中一个生存空间,因为在任何给定时间只能使用一个空间空间,也不包含永久生成,该永久生成保存虚拟机使用的元数据。线上的最后一项(例如,
0.2300771 secs
)表示执行收集所花费的时间; 在这种情况下约为四分之一秒。第三行主要收集的格式是相似的。
由
-verbose:gc
生成的输出格式在未来版本中可能会有所变化。
我不确定你为什么会有一个PSYoungGen; 你换了垃圾回收器吗?
- PSYoungGen是指用于未成年人收集的垃圾收集器。 PS代表并行清除。
- 第一组数字是年轻一代的前后尺寸,第二组是整个堆。 ( 诊断垃圾收集问题的详细格式)
- 名称表示有问题的代和收集器,第二组是整个堆。
一个关联的完整的GC的例子还显示了用于老一辈和永久世代的collections家:
3.757: [Full GC [PSYoungGen: 2672K->0K(35584K)] [ParOldGen: 3225K->5735K(43712K)] 5898K->5735K(79296K) [PSPermGen: 13533K->13516K(27584K)], 0.0860402 secs]
最后,打破你的例子日志输出的一行:
8109.128: [GC [PSYoungGen: 109884K->14201K(139904K)] 691015K->595332K(1119040K), 0.0454530 secs]
- GC前使用107Mb ,GC后使用14Mb ,最大年龄代换137Mb
- GC之前使用675Mb堆,GC之后使用581Mb堆,最大堆大小1Gb
- 自JVM启动以来,次要GC发生了8109.128秒,耗时0.04秒
我只是想提一下,可以得到详细的GC日志
-XX:+PrintGCDetails
参数。 然后你可以在答案中看到PSYoungGen或PSPermGen输出。
另外-Xloggc:gc.log
似乎会生成与-verbose:gc
相同的输出,但您可以在第一个中指定一个输出文件。
用法示例:
java -Xloggc:./memory.log -XX:+PrintGCDetails Memory
为了更好的可视化数据,你可以尝试gcviewer (一个更新的版本可以在github上find)。
注意正确写入参数,我忘了“+”,我的JBoss不会启动,没有任何错误信息!