我不是Java的新手,但是我对垃圾收集只了解一点点。现在,我想通过一些实践经验来改变这种状况。我的目标是在0.3秒以下的延迟,或者在极端情况下0.5也可以。
我有一个带有-Xmx50gb(-Xms50gb)的应用程序,并设置了以下其他GC选项:
-XX:+UseG1GC -Xloggc:somewhere.gc.log -XX:+PrintGCDateStamps
但是现在由于垃圾回收,尽管偶尔有足够的可用内存,但我偶尔会在5秒内停顿很长时间。我发现的原因之一:
[GC pause (G1 Evacuation Pause) (young) 42G->40G(48G), 5.9409662 secs]
为什么GCG1仍为此做一个“停止世界”?(或者至少我看到它恰好在此时停止了我的应用程序)以及为什么由于不需要的可用内存(如果可用RAM超过12%)而没有必要进行此类负面清理。我还认为默认值-XX:MaxGCPauseMillis是200毫秒,为什么这个值违反了29甚至50倍(请参阅下文)?
延迟的另一个原因是:
[GC pause (Metadata GC Threshold) (young) (initial-mark) 40G->39G(48G), 10.4667233 secs]
这可能会通过此答案解决,例如仅增加元数据空间-XX:MetaspaceSize=100M
顺便说一句:使用JSE 1.8.0_91-b14
更新: 此类事件的详细GC日志
2016-08-12T09:20:31.589+0200: 1178.312: [GC pause (G1 Evacuation Pause) (young) 1178.312: [G1Er