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