即使堆没有完全使用,我也会遇到重复的Full GC。
这就是gc日志的样子:http://d.pr/i/iFug(蓝线是用过的堆,灰色矩形是Full GCs)。
这似乎是一个类似于此问题中发布的问题: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模式。
可能导致这种情况的原因是什么?
答案 0 :(得分:1)
最有可能原因是您已达到当前堆的大小。堆的大小小于您设置的最大值,并在程序运行时进行调整。
e.g。假设您设置的最大值为1 GB,初始堆大小可能为256 MB,当您达到256 MB时,它会执行完整的GC,在此GC之后,它可能会确定400 MB的大小会更好,当达到此值时执行完整的GC等。
当终身空间填满或无法找到空闲空间时,您会获得一个主要收藏。例如,如果它是碎片。
如果您的幸存者空间太小,您也可以获得完整的收藏。
简而言之,最可能的原因是您使用的gc调整参数。我建议您简化调整参数,直到系统以您期望的方式运行。
答案 1 :(得分:0)
如链接线程中所述,禁用显式GC并查看是否再次出现FullGC模式:-XX:+DisableExplicitGC
。 RMI代码可能在给定间隔内触发显式GC,这在某些情况下可能是不可取的。
如果仍然发生FullGCs,我会采用线程转储和可能的堆转储来分析问题。
另外,使用jstat
查看Eden,Survivor,OldGen空间的占用。