2009-05-21 116 views
90

我已经配置java将垃圾回收信息转储到日志中(verbose GC)。我不确定日志中垃圾收集条目的含义。下面列出了这些条目的示例。我搜索了Google,并没有找到可靠的解释。Java垃圾回收日志消息

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

  1. PSYoungGen是指什么?我认为这与以前的(年轻?)一代有关,但究竟是什么?
  2. 第二个三连数和第一个三连数有什么区别?
  3. 为什么名字(PSYoungGen)为第一个三位数字指定,但不是第二个?
  4. 三元组中的每个数字(内存大小)是什么意思。例如在109884K-> 14201K(139904K)中,是GC 109884k之前的内存,然后减少到14201K。第三个数字如何相关?为什么我们需要第二组数字?

8109.128:[GC [PSYoungGen:109884K-> 14201K(139904K)] 691015K-> 595332K(1119040K),0.0454530 秒]

8112.111:[GC [PSYoungGen:126649K-> 15528K(142336K)] 707780K-> 605892K(1121472K),0.0934560 秒]

8112.802:[GC [PSYoungGen:130344K-> 3732K(118592K)] 720708K-> 607895K(1097728K),0.0682690 秒]

+0

整堆,堆的年轻一代部分,小gc如何工作,检查例如HTTP://www.cubrid。org/blog/dev-platform/understanding-java-garbage-collection/ – MarianP 2015-02-26 13:05:23

回答

83

大部分内容都在GC Tuning Guide中解释过(无论如何你都会很好地阅读)。

命令行选项-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中,你改变垃圾收集器了吗?

+0

哪里可以找到gc日志文件? – janwen 2012-11-20 08:14:32

+5

这个答案并没有真正解决原始问题。我觉得michaeljoseph的回答更好。它解决了Ethan提出的问题,并更好地分解了最初的例子。虽然他的回答中存在两个问题(他的链接现在已经死了,而rafa.ferreria指出了另一个问题),但它不仅仅反刍Oracle文档。 – Dirk 2014-04-23 17:04:14

116
  1. PSYoungGen是指用于次要集合的垃圾收集器。 PS代表并行清除。
  2. 第一组数字是年轻一代之前/之后的大小,第二组是整个堆。 (Diagnosing a Garbage Collection problem详细说明了格式)
  3. 名称指示所讨论的产生和收集器,所述第二组是整个堆。

关联的完整GC的一个例子也显示了用于旧的和永久代收藏家:

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] 
  • 107Mb用于GC之前,14Mb用于GC之后,max哟UNG代大小137MB
  • 675Mb堆GC之前使用,GC之后使用581Mb堆,1Gb的最大堆大小
  • 轻微GC发生8109.128秒自JVM开始,把0.04
+8

只是一个小小的评论,'()'之间的值不是最大尺寸,永远都不是最大尺寸。如果GC不能释放堆,那么操作系统将需要更多的空间,这个值将会增加。当然尊重下面定义的限制:-Xmx – 2011-03-03 17:07:58

22

我只是想提一提,可以得到详细的GC日志与

-XX:+PrintGCDetails 

参数。然后你会在答案中看到PSYoungGen或PSPermGen输出。

另外-Xloggc:gc.log似乎会产生像-verbose:gc一样的输出,但您可以在第一个中指定一个输出文件。

用法示例:

java -Xloggc:./memory.log -XX:+PrintGCDetails Memory 

可视化数据的更好,你可以尝试gcviewer(较新的版本可以在github找到)。

注意正确写入参数,我忘记了“+”,我的JBoss无法启动,没有任何错误信息!