1

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

2013-02-28T12:02:13.209+0100: 1486457.849: [GC 1486457.850: [ParNew 3483368K->96838K(3774912K), 0.2273030 secs ] 8085678K->4710336K(49912256K), 0.2278070 secs] [Times: user=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 secs ] 8065856K->4748772K(49912256K), 0.2392150 secs] [Times: user=1.64 sys= 0.01,实数=0.24 秒]

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] [Times: user=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 secs ] 6679353K->3374156K(49912256K), 0.0295550 secs] [Times: user=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 secs ] 6729676K->3395688K(49912256K), 0.0321860 secs] [Times: user=0.22 sys= 0.00,实数=0.03 秒]

在 Full GC 之后(由于 perm 空间耗尽),年轻代收集时间从 0.23 秒减少到 0.03 秒(10 次)。

我要找出perm空间变满的原因,但是我不明白的是为什么年轻代收集时间会因为Full GC而减少10倍。

有谁能够帮我?

谢谢,琼。

4

1 回答 1

1

有了提到的日志,我可以说几点。

原因可能是:

随着程序的运行,分配发生并且引用发生。短暂的对象死亡和休息被提升到幸存者空间或永久空间。

可能的引用情况如下。

1) eden 空间(年轻一代)中的对象和 perm 空间和tenured 空间中的幸存者空间参考对象,使它们的寿命更长。

2)有时perm空间和tenured空间中的对象引用年轻一代对象(在eden空间和survivor空间)。

由于tenured 和 perm 空间中的垃圾收集不如年轻代频繁。

可能存在这样的情况,即永久空间或永久空间中的对象说obj1不再被引用并准备好被 GC 声明,所以这个obj1正在等待 GC,这种情况很少发生。同样,这个obj1可能已经引用了幸存者中的对象和伊甸园空间。因此obj1引用的伊甸园空间和幸存者空间中的对象不符合垃圾回收条件。因此,在伊甸园空间和幸存者空间中可能有很多这样的对象,这些对象被永久空间中的obj1等对象引用,这导致伊甸园和幸存者空间中的对象数量更多。因此,次要 GC 需要更多时间。

在full GC中,像obj1这样的对象被收集,所以像obj1这样的对象引用的eden和survivor中的对象也没有被GC声明,导致eden和survivor空间中的对象更少。由于对象数量较少,所以次要 GC 花费的时间更少。如果您观察到更多日志慢慢地小 Gc 时间再次增加(0.0289980 秒,0.0316570 如您的日志中所述),它可能会增加直到下一次 FULL GC 。

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

于 2013-02-28T22:03:26.590 回答