What is the default Full GC interval in Java 8

2019-04-02 02:08发布

问题:

We noticed a strange behavior on our production server (JavaEE, Wildfly 10). The Java VM do once per hour Full GC although there is still enough memory available.

The VM start parameters are:

-server
-Xms4g
-Xmx8g

The following parameters are not activated:

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

So what is the default Full GC interval in Java 8 and how can I configure it to be dynamic?

回答1:

You say that

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

are not "activated". However, those are the default values for those properties; i.e. the values that you get if you DON'T specify values for the properties.

Reference: Oracle's sun.rmi Properties documentation.

So what is the default Full GC interval in Java 8

See above for the DCG triggered full GCs.

Apart from that, a full GC happens when requested (by a System.gc() call) or when the JVM decides it is necessary. There is no fixed interval if you are not using RMI.

... and how can I configure it to be dynamic?

If you mean, how can you stop RMI from triggering a full GC every hour:

  • One way is to specify (much) larger values for those properties.

  • Another way is to launch the JVM with the -XX:+DisableExplicitGC flags. Note: this will disable all calls to System.gc() not just the calls that RMI's DGC makes.



回答2:

Another solution would be to set the option

 -XX:+ExplicitGCInvokesConcurrent 

in combination with

 -XX:+UseG1GC

This way System.gc() will not be disabled but less harmful by making the GC work in concurrent mode instead of causing "stop the world" situations. I used this to successfully reduce my GC pauses in WildFly from 10 seconds to 500ms.