為什麼 Full GC 沒有在我設置的 gcInterval 上執行?
- ColdFusion 10 更新 10
- 視窗伺服器 2008 R2
- Java 1.7.0_21
我試圖讓 Full GC 每 10 分鐘執行一次。我過去在早期版本的 ColdFusion 上成功使用了 gcInterval JVM arg,但我已經通過詳細的 GC 日誌確認每小時仍在發生 Full GC(除非 Old Gen 變得如此滿以至於它強制進行完整收集) .
以下是來自 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
為了方便任何人在 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 伺服器。
——魯佩什·庫馬爾