Java 垃圾回收日志消息

2022-08-31 10:31:33

我已经将java配置为将垃圾回收信息转储到日志中(详细GC)。我不确定日志中的垃圾回收条目是什么意思。这些条目的示例发布在下面。我在谷歌上搜索了一下,没有找到可靠的解释。

我有一些合理的猜测,但我正在寻找答案,这些答案提供了条目中数字含义的严格定义,并得到了可靠来源的支持。自动 +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 秒]


答案 1
  1. PSYoungGen 是指用于次要收集的垃圾回收器。PS 代表 平行拾荒。
  2. 第一组数字是年轻一代之前/之后的大小,第二组数字是针对整个堆的。(诊断垃圾回收问题详细说明了格式)
  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]
  • GC之前使用107Mb,GC之后使用14Mb,最大年轻一代大小137Mb
  • GC 之前使用的堆为 675Mb,GC 之后使用的堆为 581Mb,最大堆大小为 1Gb
  • 自 JVM 启动以来,次要 GC 发生在 8109.128 秒内,耗时 0.04

答案 2

其中大部分内容都在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

括号中的下一个数字(例如,再次从第一行开始)是堆的提交大小:可用于java对象的空间量,而无需从操作系统请求更多内存。请注意,此数字不包括其中一个幸存者空间,因为在任何给定时间只能使用一个,并且也不包括永久生成,永久生成保存虚拟机使用的元数据。(776768K)

行上的最后一项(例如,)表示执行收集所花费的时间;在这种情况下,大约四分之一秒。0.2300771 secs

第三行中主要集合的格式类似。

-verbose:gc 生成的输出格式在将来的版本中可能会发生更改。

我不确定为什么你的PSYoungGen;您是否更改了垃圾回收器?