2

我正在查看 Solr 安装的 gc 日志文件,我注意到它花费了 30% 的时间来执行年轻代 gc。下面的日志片段跨越大约一秒,gc 时间加起来为 0.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] 
4

2 回答 2

4

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

另一个极端将是一个问题:对象被创建、老化和停留时间过长。这就是发生内存泄漏和填充烫发空间的地方。

于 2012-04-21T12:53:01.503 回答
2

我觉得你这里确实有问题。

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

我的诊断是您的堆几乎已满,并且直接导致您花费大量(并且越来越多)时间进行垃圾收集。

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

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

于 2012-04-21T14:18:44.240 回答