Java 8中的默认Full GC间隔是多少?

时间:2018-02-06 10:12:15

标签: java jboss garbage-collection wildfly

我们在生产服务器上发现了一个奇怪的行为(JavaEE,Wildfly 10)。 Java VM每小时执行一次Full GC,尽管仍有足够的可用内存。

enter image description here

VM启动参数为:

-server
-Xms4g
-Xmx8g

以下参数已激活:

-Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.dgc.server.gcInterval=3600000

那么Java 8中的默认Full GC间隔是什么?如何将其配置为动态?

2 个答案:

答案 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,ZGCShenandoah

    您可以调整其他内容以减少并发收集器“停止世界”暂停,但这超出了此问题的范围。

答案 1 :(得分:0)

另一种解决方案是设置选项

 -XX:+ExplicitGCInvokesConcurrent 

结合使用
 -XX:+UseG1GC

这样,System.gc()不会被禁用,但通过使GC在并发模式下工作而不是导致"停止世界"的情况。我用它来成功地将WildFly中的GC暂停从10秒减少到500毫秒。