0

我一直在尝试控制使用 JMX(称为分布式GC)时由 RMI 触发的 Full GC 之间的间隔。具体来说,我像这样启动我的 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 小时(值以毫秒为单位)。因此,根据我在网上看到的情况,我应该期望 Full GC(系统)每两个小时发生一次。不幸的是,情况似乎并非如此,在检查 GC 日志文件时,我恰好每小时观察一次 Full GC(系统),这是此类 GC 的默认间隔。

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

因此,似乎用低于一小时的值覆盖默认间隔将起作用,而尝试以低于一小时的频率获取 FGC 则不起作用。这与我在网上看到的相矛盾,这里人们似乎可以通过这个选项控制频率。

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

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

[root@machine]# java -version

java版本“1.6.0_37”

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

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

4

1 回答 1

1

我终于找到了摆脱这个问题的方法。不工作的原因server.gcInterval是脚本需要定义客户端 coutnerpartclient.gcInterval才能工作。

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

于 2013-06-12T09:13:38.150 回答