Tomcat

為什麼 Full GC 沒有在我設置的 gcInterval 上執行?

  • December 12, 2013
  • 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 上找到此內容,以下是 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 伺服器。

——魯佩什·庫馬爾

引用自:https://serverfault.com/questions/518457