完整GC后,年轻一代的收集减少了10倍

时间:2013-02-28 18:25:51

标签: java garbage-collection

这里我有一个gc.log的摘录:

2013-02-28T12:02:13.209 + 0100:1486457.849:[GC 1486457.850:[ParNew]  3483368K-> 96838K(3774912K), 0.2273030秒] 8085678K-> 4710336K(49912256K),0.2278070秒] [时间:用户= 1.54 sys = 0.01,实际= 0.23秒]

2013-02-28T12:02:26.551 + 0100:1486471.191:[GC 1486471.191:[ParNew]  3452358K-> 125528K(3774912K), 0.2386800秒] 8065856K-> 4748772K(49912256K),0.2392150 secs] [次:用户= 1.64 sys = 0.01,real = 0.24 secs]

2013-02-28T12:02:27.398 + 0100:1486472.038:[ Full GC 1486472.039:[CMS:4623244K-> 3323834K(46137344K),3.0873920 secs] 5034629K-> 3323834K( 49912256K),[CMS Perm:97619K-> 54323K(98304K)],3.0878880 secs] [次:用户= 3.04 sys = 0.01,real = 3.08 secs]

2013-02-28T12:02:42.758 + 0100:1486487.398:[GC 1486487.399:[ParNew]  3355519K-> 50321K(3774912K), 0.0289980秒] 6679353K-> 3374156K(49912256K),0.0295550秒] [时间:用户= 0.20 sys = 0.00,实际= 0.03秒]

2013-02-28T12:02:59.045 + 0100:1486503.685:[GC 1486503.685:[ParNew]  3405841K-> 71853K(3774912K), 0.0316570秒] 6729676K-> 3395688K(49912256K),0.0321860秒] [时间:用户= 0.22 sys = 0.00,实际= 0.03秒]

在完整GC之后(由于烫发空间耗尽),年轻一代的收藏从0,23秒减少到0,03秒(10次)。

我必须找出烫发空间变满的原因,但我不明白为什么年轻一代的收集时间因全GC而降低10倍。

有人能帮助我吗?

谢谢, 琼。

1 个答案:

答案 0 :(得分:1)

根据提到的日志,我可以说几点。

原因可能是:

程序运行时,会发生分配并进行引用。短命的物体死亡和休息被提升为幸存者空间或烫发空间。

可能的参考情况如下。

1)伊甸园空间中的物体(年轻一代)和幸存者空间参照物体在烫发空间和终身空间中使它们活得更长。

2)烫发空间和终身空间中的物体有时会引用年轻一代的物体(在伊甸园空间和幸存者空间中)。

由于在终身和烫发空间的垃圾收集不像年轻一代那样频繁。

可能存在这样的情况,即烫发空间或终身空间中的物体说 obj1 不再被引用并准备被GC声明,因此 obj1 正在等待GC,很少发生。再次 obj1 可以引用幸存者和伊甸园空间中的对象。因此,在 obj1 引用的eden空间和幸存者空间中的此对象不符合垃圾回收的条件。所以在伊甸园空间和幸存者空间中可能存在许多像这样的对象,这些对象被来自烫发空间的 obj1 等对象引用,这导致伊甸园和幸存者空间中的对象数量更多。因此,小型GC需要更多时间。

在完整的GC中,会收集像 obj1 这样的对象,因此GC中也不会声明像 obj1 这样的对象引用的eden和幸存者中没有任何对象伊甸园和幸存者空间中的物体。由于对象数量较少,因此较小的GC需要较少的时间。如果你慢慢观察到更多的日志,那么较小的Gc时间会再次增加(0.0289980秒,如你的日志中提到的0.0316570),它可能会增加到下一个FULL GC。

您还可以在Full GC之前观察GC时间的模式,它会增加。(0.2273030秒,如日志中所述的0.2386800秒)