显式设置分布式GC的间隔似乎不起作用

时间:2013-05-15 10:23:13

标签: java garbage-collection rmi frequency

在使用JMX(称为分布式 GC)时,我一直在尝试控制由RMI触发的Full GCs之间的间隔。具体来说,我就像这样开始我的java平台:

java -javaagent:../lib/licenceagent.jar=../etc/licence.lic,../etc/publicKeys.store -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:HeapDumpPath=../logs -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:../logs/gc.log -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=8004 -Dsun.rmi.dgc.server.gcInterval=7200000 -cp ../lib/myjar.jar:../etc:../data com.acme.myExecutable

如您所见,我将服务器GC间隔设置为2小时(该值以毫秒为单位)。因此,根据我在网上看到的情况,我应该期望每两个小时就会发生一次完整的GC(系统)。不幸的是,情况似乎并非如此,在检查GC日志文件时,我每小时都会看到一个完整的GC(系统),这是此类GC的默认间隔。

有趣的是,如果我将服务器GC间隔设置为小于一小时的值,例如我已尝试30000每30秒给我一个GC,我可以每隔30秒看到一次GC。

因此,如果低于一小时的值可能会覆盖默认间隔,那么尝试使FGC的频率低于一小时则不起作用。这与我在网上看到的相矛盾,在这里人们似乎能够通过这个选项来控制频率。

我尝试了一些方法,例如尝试在发生冲突时替换启动选项,或者甚至在启动脚本中重要的参数顺序改变它们的顺序(不是我知道这是真的),但没有。想知道是否有人遇到过同样的问题,或者可以推荐一种方法来确保这种方法有效吗?

我的测试是在CentOS 64位机器上进行的:

  

[root @ machine] #java -version

     

java版本" 1.6.0_37"

     

Java(TM)SE运行时环境(版本1.6.0_37-b06)

     

Java HotSpot(TM)64位服务器VM(版本20.12-b01,混合模式)

1 个答案:

答案 0 :(得分:1)

我终于找到了解决这个问题的方法。 server.gcInterval无法正常工作的原因是,需要定义客户端coutnerpart client.gcInterval以便工作。

我没有在Oracle文档或网络上的任何地方看到过这种依赖关系,而我必须意识到的唯一方法就是尝试。