0

我在某个程序中使用 Hotspot 的 GC 遇到了一些奇怪的事情。有时,似乎清除 GC 几乎就死了,每次 Eden 空间填满时,只剩下标记-清除 GC 运行。不用说,这对性能来说是可怕的。我还没有设法弄清楚这个问题发生的条件。

现在看看具有这种行为的 JVM,老一代是 170 MB(已使用和最大),并且永远不会在集合中增长或缩小,伊甸园一代是 85 MB,Survivor 空间从未使用过(我猜是与 scavenge GC 未运行一致),分配的总堆大小为 256 MB(显然,匹配 Old+Eden)。

关于可能导致这种情况的任何线索?

4

1 回答 1

4

我怀疑堆太满了。如果old space + eden space加起来就是最大堆空间,那么survivor空间就没有空间了,分代收集器就不能运行了。

尝试增加最大堆空间。


关键是幸存者空间中必须有足够的空闲空间来容纳所有在伊甸园空间集合中幸存下来的对象。如果可用空间不可用,则复制收集器将无法工作,JVM 必须退回到标记和清除。

这是世代/复制收集器如何工作的基础。

就像我说的,尝试增加堆空间。

于 2011-07-09T05:22:53.543 回答