为什么我的Java应用程序花费30%的时间用于年轻一代gc?

时间:2012-04-21 12:47:26

标签: java solr garbage-collection

我正在查看我们的Solr安装的gc日志文件,我注意到它花了30%的时间做年轻一代的gc。下面的日志片段跨越大约一秒钟,gc时间加起来为.34秒。

我的问题是:这是一个问题,如果是这样,是什么导致了它?

我在Linux上运行jdk 1.6.0_24

1004626.109: [GC 1004626.109: [ParNew: 74847K->5219K(76672K), 0.0838750 secs] 10831779K-
10762151K(11525824K), 0.0841790 secs] [Times: user=0.24 sys=0.00, real=0.09 secs] 
1004626.320: [GC 1004626.320: [ParNew: 73379K->5468K(76672K), 0.0527070 secs] 10830311K->10762874K(11525824K), 0.0529680 secs] [Times: user=0.20 sys=0.00, real=0.06 secs] 
1004626.511: [GC 1004626.511: [ParNew: 73628K->4986K(76672K), 0.0591070 secs] 10831034K->10763002K(11525824K), 0.0593820 secs] [Times: user=0.20 sys=0.00, real=0.05 secs] 
1004626.698: [GC 1004626.698: [ParNew: 73146K->5611K(76672K), 0.0523060 secs] 10831162K->10764169K(11525824K), 0.0525820 secs] [Times: user=0.21 sys=0.00, real=0.05 secs] 
1004626.902: [GC 1004626.902: [ParNew: 73771K->6878K(76672K), 0.0653490 secs] 10832329K->10765868K(11525824K), 0.0656210 secs] [Times: user=0.22 sys=0.00, real=0.06 secs] 

2 个答案:

答案 0 :(得分:4)

不,这不是问题。这意味着您的对象来来去去 - 您在范围内创建它们,使用它们,然后它们就有资格使用GC。我不认为这表明出现了问题。

另一个极端是一个问题:对象被创造,年龄和持续时间过长。这就是内存泄漏和填充的perm空间发生的地方。

答案 1 :(得分:2)

我认为你在这里有问题。

我不是阅读GC日志的专家,但我认为它有一个76672K的'年轻'空间,总堆大小为11525824K。此外,每个GC循环后的总堆使用量为10765868K ......并且还在增长。它(显然)花费了大约30%的时间来收集垃圾。

我的诊断是您的堆几乎已满,并且您将花费大量(并且不断增加的)时间垃圾收集作为直接结果。

我的建议是重启应用程序(短期),并寻找内存泄漏(长期)。如果没有内存泄漏(即您的应用程序使用所有堆空间),那么您需要寻找减少应用程序内存使用量的方法。

您的应用程序似乎确实产生了相当多的垃圾,但这不一定是一个担心。 HotSpot GC可以非常有效地回收垃圾。它必须处理的非垃圾量会导致性能问题。

相关问题