我们在生产服务器上发现了一个奇怪的行为(JavaEE,Wildfly 10)。 Java VM每小时执行一次Full GC,尽管仍有足够的可用内存。
VM启动参数为:
-server
-Xms4g
-Xmx8g
以下参数未已激活:
-Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.dgc.server.gcInterval=3600000
那么Java 8中的默认Full GC间隔是什么?如何将其配置为动态?
答案 0 :(得分:3)
你说那个
-Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.dgc.server.gcInterval=3600000
未被“激活”。但是,这些是这些属性的默认值;即,如果不指定属性的值,则获得的值。
参考:Oracle的sun.rmi Properties文档。
那么Java 8中的默认Full GC间隔是什么
请参阅上文,了解DCG触发的完整GC。
除此之外,当请求(通过System.gc()
调用)或JVM确定有必要时,会发生完整的GC。如果您不使用RMI,则没有固定的间隔。
...如何将其配置为动态?
如果您的意思是,如何阻止RMI每小时触发一次完整的GC:
一种方法是为这些属性指定(更多)更大的值。
另一种方法是使用-XX:+DisableExplicitGC
标志启动JVM。注意:这将禁用对System.gc()
的所有调用,而不仅仅是RMI的DGC调用。另请参阅:Impact of setting -XX:+DisableExplicitGC when NIO direct buffers are used了解可能导致的一些问题。
第三种方法是使用-XX:+ExplicitGCInvokesConcurrent
标志。这减少了对System.gc()
的调用的影响,但它只适用于支持并发收集的GC;例如CMS,G1,ZGC或Shenandoah。
您可以调整其他内容以减少并发收集器“停止世界”暂停,但这超出了此问题的范围。
答案 1 :(得分:0)
另一种解决方案是设置选项
-XX:+ExplicitGCInvokesConcurrent
与
结合使用 -XX:+UseG1GC
这样,System.gc()不会被禁用,但通过使GC在并发模式下工作而不是导致"停止世界"的情况。我用它来成功地将WildFly中的GC暂停从10秒减少到500毫秒。