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毫秒。