Java 8中的默认Full GC间隔是多少
我们在生产服务器上发现了一个奇怪的行为(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间隔是什么?如何将其配置为动态?
你这么说
-Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000
没有“激活”。 但是,这些是这些属性的默认值; 即,如果不指定属性的值,则获得的值。
参考:Oracle的sun.rmi属性文档。
那么Java 8中的默认Full GC间隔是多少?
请参阅上文,了解DCG触发的完整GC。
除此之外,当请求(通过System.gc()
调用)或JVM确定有必要时,会发生完整的GC。 如果您不使用RMI,则没有固定的间隔。
……我怎样才能将其配置为动态?
如果您的意思是,如何阻止RMI每小时触发一次完整的GC:
-
一种方法是为这些属性指定(更多)更大的值。
-
另一种方法是使用
-XX:+DisableExplicitGC
标志启动JVM。 注意:这将禁用对System.gc()
所有调用,而不仅仅是RMI的DGC调用。
另一种解决方案是设置选项
-XX:+ExplicitGCInvokesConcurrent
与…结合
-XX:+UseG1GC
这样,通过使GC在并发模式下工作而不是导致“停止世界”的情况,System.gc()不会被禁用但危害较小。 我用它来成功地将WildFly中的GC暂停从10秒减少到500毫秒。