Java垃圾收集日志消息

我已经configuration了Java将垃圾收集信息转储到日志( verbose GC )。 我不确定日志中垃圾收集条目的含义。 这些条目的样本张贴在下面。 我在Google上search过 ,没有find明确的解释。

我有一些合理的猜测,但我正在寻找答案,提供严格的条目数字是什么意思,由可靠的来源支持的定义。 所有答案的自动+1引用sun文档。 我的问题是:

  1. PSYoungGen是指什么? 我认为这与前一代(年轻一代)有关,但究竟是什么?
  2. 数字的第二个三位数与第一个三位数的区别是什么?
  3. 为什么名字(PSYoungGen)为第一个三位数字指定,而不是第二个?
  4. 每个数字(内存大小)在三元组是什么意思。 例如在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; 你换了垃圾回收器吗?

  1. PSYoungGen是指用于未成年人收集的垃圾收集器。 PS代表并行清除。
  2. 第一组数字是年轻一代的前后尺寸,第二组是整个堆。 ( 诊断垃圾收集问题的详细格式)
  3. 名称表示有问题的代和收集器,第二组是整个堆。

一个关联的完整的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不会启动,没有任何错误信息!