2013-02-15 77 views
29

我們運行了很多Tomcat服務器,並且觀察到完整垃圾回收(GC)通常每小時執行一次,特別是當內存使用率相對較低時。準確的時間似乎與應用程序服務器啓動的時間有關;如果服務器在01:13啓動,完整的GC在02:13完成,下一個完整的GC將在03:13完成。我一直無法找到任何文件來解釋這種行爲。爲什麼這些Tomcat服務器的JVM每小時執行一次完整的GC?

這是一個問題,因爲同時啓動的服務器池都傾向於在大約同一時間完成全部GC。如果GC延遲時間足以導致負載平衡器將服務器標記爲關閉,則整個應用程序可以在一段時間內脫機。如果完整的GC可以在一段時間內分佈,這樣會更好,因此沒有兩個服務器同時進行完整的GC,但我找不到任何方法來控制此行爲。

是否有其他人看到過這種行爲?有什麼方法可以影響這些「常規」完整GC發生的時間嗎?

+1

你是否有一個時間表運行的進程(通過石英等)可能會填補定期堆起來? – 2013-02-15 20:41:46

回答

25

你的「正規軍」每小時的GC可能是由於this known bug,「的JreMemoryLeakPreventionListener造成一個完整的GC每隔一小時,當gcDaemonProtection =真」。

確認您的Tomcat版本和您的JreMemoryLeakPreventionListener(默認爲true)的gcDaemonProtection屬性的值。

該補丁據稱包含在Tomcat v.7.0.28 +和v.6.0.36 +中。

要麼升級您的服務器(S),或選擇從here非升級的解決方案,概括爲:使用JVM ARG -XX:+DisableExplicitGC

  • 保持充分的GC

    1. 抑制完整的垃圾收集,但推遲到CMS的收集器使用JVM ARG -XX:+ExplicitGCInvokesConcurrent
    2. 設置<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" gcDaemonProtection="false"/>
    3. 禁用監聽

    信貸到期的貸方;我從here獲得了我的初步答案。

  • +3

    喜歡在這個問題的Tomcat的Bugzilla條目的評論:_「默認情況下,一個完整的GC現在將發生大約每2.9億年。」_ :) – Matt 2013-06-04 09:44:16

    3

    ,你應該能夠通過

    -Dsun.rmi.dgc.client.gcInterval=60000 
    -Dsun.rmi.dgc.server.gcInterval=60000 
    

    採取這裏看看來改變時間間隔 https://docs.oracle.com/cd/E19199-01/817-2180-10/pt_chap5.html

    +1

    擊敗我吧...和這裏http:// docs .oracle.com/javase/6/docs/technotes/guides/rmi/sunrmiproperties.html – Matt 2013-02-15 20:49:47

    +0

    除非Tomcat或其中的Web應用程序正在執行RMI,否則我不會看到這會帶來怎樣的差異。 – EJP 2013-08-09 00:05:00

    +1

    答案中的鏈接已死亡。 Wayback存檔:http://web.archive.org/web/20130330063117/http://ehcache.org/documentation/operations/garbage-collection – Dave 2016-05-25 08:53:34

    相關問題