我发现这个:
-XX:GCHeapFreeLimit=2 - 定义完全 GC 之后在抛出 OutOfMemoryError 之前可用空间的最小百分比
但是当我尝试在我的应用程序中使用此选项时,我遇到了问题
我的 JVM 的选项是:
-server -d64 -Xss256k
-verbose:gc
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+PrintGCApplicationStoppedTime
-Xms332m
-Xmx332m
-XX:NewSize=128m
-XX:MaxNewSize=128m
-XX:PermSize=64m
-XX:MaxPermSize=64m
-XX:+DisableExplicitGC
-XX:+UseParNewGC
-XX:ParallelGCThreads=2
-XX:ParallelGCThreads=2
-XX:MaxTenuringThreshold=1
-XX:SurvivorRatio=8
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled
-XX:CMSInitiatingOccupancyFraction=60
-XX:+UseCMSInitiatingOccupancyOnly
-XX:GCHeapFreeLimit=40
-XX:GCTimeLimit=70
所以(-XX:GCHeapFreeLimit=40)我想如果在完全 GC 之后,空闲堆大小会小于 40%,我会看到 OOME。但它并没有发生。我有很多类似的日志消息:
[Full GC [CMS2013-08-15T14:20:47.068+0100: [CMS-concurrent-mark: 0.200/0.203 secs] [Times: user=0.38 sys=0.02, real=0.20 secs]
(concurrent mode failure): 208895K->208895K(208896K), 0.8387700 secs] 326911K->304069K(326912K), [CMS Perm : 35941K->35939K(65536K)], 0.8388880 secs] [Times
: user=0.83 sys=0.00, real=0.84 secs]
我可以看到 (326911-304069)/326911 超过 60%。但我的申请并没有失败。