为什么我设置的 gcInterval 上没有运行完整的 GC?

为什么我设置的 gcInterval 上没有运行完整的 GC?
  • ColdFusion 10 更新 10
  • Windows Server 2008 R2
  • Java 1.7.0_21

我正在尝试计算每 10 分钟运行一次完整 GC。我过去曾在早期版本的 ColdFusion 上成功使用过 gcInterval JVM 参数,但我已通过详细的 GC 日志确认完整 GC 仍每小时发生一次(除非旧代已满到强制进行完整收集)。

以下是 ColdFusion10\cfusion\bin\jvm.config 中的完整 JVM 参数(为方便阅读添加了换行符)

我还需要做其他什么事情才能使其在 ColdFusion 10 上运行吗?

java.args=
-server
-Xms4072m
-Xmx4072m
-XX:PermSize=512m
-XX:MaxPermSize=512m
-Dsun.rmi.dgc.client.gcInterval=600000
-Dsun.rmi.dgc.server.gcInterval=600000
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-Xloggc:gc.log
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize=1024K
-Xbatch
-Dcoldfusion.home={application.home}
-Dcoldfusion.rootDir={application.home}
-Dcoldfusion.libPath={application.home}/lib
-Dorg.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER=true
-Dcoldfusion.jsafe.defaultalgo=FIPS186Random
-Dcoldfusion.classPath={application.home}/lib/updates,{application.home}/lib,{application.home}/lib/axis2,{application.home}/gateway/lib/,{application.home}/wwwroot/WEB-INF/flex/jars,{application.home}/wwwroot/WEB-INF/cfform/jars

答案1

为了让任何人在 Google 上找到这个问题,这里是 Adob​​e 工程师 Rupesh Kumar 针对我上面链接的票证向我提供的答案。


Brad,一般来说,JVM 不会以固定的定期间隔运行 GC。何时运行完整 GC 完全由 JVM 决定。在 RMI 的情况下,由于对象被其他 VM 导出和使用,因此垃圾收集是分布式的,因此得名 dgc。查看以下链接以了解 DGC 是什么http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp?topic=%2Fcom.ibm.java.doc.diagnostics.50%2Fdiag%2Funderstanding%2Frmi_dgc.html http://java.sys-con.com/node/35865

由于其性质,DGC 需要有一个 GC 运行频率,以便收集未使用的对象。在 JDK 1.6 之前,此默认间隔为 60 秒,从 JDK 1.6 开始,默认间隔已增加到 1 小时。

现在来谈谈为什么此设置现在不起作用,默认情况下,RMI 服务器不会在 Tomcat 中运行,因此 DGC 不会运行。对于 CF 9,内置服务器是 JRun,它是堆栈应用程序服务器,当然会运行 RMI 服务器。

--鲁佩什·库马尔

答案2

1 小时完整 GC 似乎是 Tomcat 或 CF10 的一个功能,是的,我也在尝试让定时完整 GC 发生时遇到问题;我发现最后一项很奇怪,因为这是 JVM 功能而不是 Tomcat 功能,除非它在 ​​Tomcat 中的某个地方被抑制了。我还发现,CF Admin 中的指标日志记录设置不会创建非常有用的指标;与 JRun 中的情况不同。

答案3

首先我要说的是,我绝不是垃圾收集或 JVM 配置方面的专家。据我所知,您无法控制您正在尝试的垃圾收集。您可以“要求”垃圾收集器以一定的时间间隔运行,但如果垃圾收集不是必需的,那么它就不会运行。

以下两个链接对我非常有用:

JVM内存管理和ColdFusion日志分析

性能调优

来自上面的第一个链接:

无法控制垃圾收集的确切运行时间。应用程序可以要求 JVM 运行 GC,但 JVM 不一定会在请求时运行 GC,而是会在下一次机会时安排它。通常,应用程序不会要求 JVM 执行 GC。相反,JVM 被配置为使用几种可能的算法之一来最佳地执行垃圾收集。算法的选择基于应用程序的需求,并且可以以不同的方式影响性能。目标是选择一种适合您的硬件资源和应用程序需求的算法。理想情况下,对于 Web 应用程序,最好选择一种对用户体验影响最小的算法。这里的 -XX:+UseParallelGC 是安装 ColdFusion 时的默认配置。

相关内容