2

即使堆没有完全使用,我也会遇到重复的 Full GC。

这是 gc 日志的样子:http ://d.pr/i/iFug (蓝线是使用的堆,灰色矩形是 Full GC)。

这似乎是一个类似于这个问题中发布的问题:Frequent full GC with empty heap

但是,该线程没有为该问题提供任何实际答案。我的应用程序确实使用 RMI,生产服务器在升级 45 之前确实使用 1.6,将 GC 间隔从 1 分钟增加到 1 小时(http://docs.oracle.com/javase/7/docs/technotes/guides/rmi /relnotes.html)。但是,从日志的其余部分来看,我看不到 Full-GC-every-1-min 模式。

这可能是什么原因造成的?

4

2 回答 2

1

最有可能的原因是您已达到堆的当前大小。堆的大小小于您设置的最大值,并在程序运行时进行调整。

例如,假设您设置的最大值为 1 GB,初始堆大小可能为 256 MB,当您达到 256 MB 时,它会执行一次完整的 GC,在此 GC 之后,它可能会决定 400 MB 的大小会更好,当达到执行完整的 GC 等。


当永久空间填满或无法找到可用空间时,您将获得一个主要集合。例如,如果它是碎片化的。

如果您的幸存者空间太小,您还可以获得完整的收藏。

简而言之,最可能的原因是您使用的 gc 调优参数。我建议您简化调整参数,直到您的系统以您期望的方式运行。

于 2013-09-26T18:35:41.603 回答
0

如链接线程中所述,禁用显式 GC 并查看 FullGC 模式是否再次出现:-XX:+DisableExplicitGC。RMI 代码可能会在给定的时间间隔内触发显式 GC,这在某些情况下可能是不可取的。

如果 FullGC 仍然发生,我会使用线程转储和可能的堆转储来分析问题。

此外,用于jstat查看 Eden、Survivor、OldGen 空间的占用情况。

于 2013-09-26T18:42:04.383 回答