2013-02-15 2 views
29

Wir betreiben viele Tomcat-Server und haben beobachtet, dass volle Speicherbereinigungen (GCs) oft stündlich durchgeführt werden, insbesondere wenn die Speicherauslastung relativ gering ist. Die genaue Uhrzeit scheint relativ zu der Zeit zu sein, zu der der Anwendungsserver gestartet wurde. Wenn ein Server um 01:13 Uhr gestartet wird, wird um 02:13 Uhr ein vollständiger GC durchgeführt, und der nächste vollständige GC wird um 03:13 Uhr stattfinden. Ich konnte keine Dokumentation finden, um dieses Verhalten zu erklären.Warum führt die JVM dieser Tomcat-Server stündlich einen vollständigen GC aus?

Dies ist ein Problem, da ein Serverpool gleichzeitig gestartet wird. Alle neigen dazu, ungefähr zur gleichen Zeit vollständige GCs auszuführen. Wenn die GC-Verzögerung lang genug ist, damit ein Load-Balancer einen Server als inaktiv markiert, kann die gesamte Anwendung für einige Zeit offline gehen. Es wäre besser, wenn die vollständigen GCs über einen Zeitraum verteilt werden könnten, so dass keine zwei Server gleichzeitig einen vollständigen GC ausführen, aber ich kann keinen Weg finden, dieses Verhalten zu kontrollieren.

Hat jemand anderes dieses Verhalten gesehen? Gibt es eine Möglichkeit zu beeinflussen, wenn diese "normalen" vollständigen GCs passieren?

+1

Haben Sie einen Prozess, der sich auf einen Zeitplan läuft (über Quartz, et al.), Die erfüllete den Haufen regelmäßig aufmachen? –

Antwort

25

Ihre "normalen" stündlich GCs wahrscheinlich aufgrund this known bug sind "Die JreMemoryLeakPreventionListener bewirkt eine vollständige GC jede Stunde, wenn gcDaemonProtection = true".

Bestätigen Sie Ihre Tomcat-Versionen und den Wert der gcDaemonProtection-Eigenschaft Ihres JreMemoryLeakPreventionListener (Standard ist true).

Der Patch wurde angeblich in Tomcat v.7.0.28 + und v.6.0.36 + enthalten.

Entweder aktualisieren Sie Ihren Server (n), oder wählen Sie eine nicht-Upgrade-Lösung von here, zusammengefasst wie:

  1. Unterdrückungs volle Garbage Collection JVM arg -XX:+DisableExplicitGC
  2. die volle GCs halten verwenden, sondern verschieben zu das CMS Kollektor mit JVM arg -XX:+ExplicitGCInvokesConcurrent
  3. gesetzt <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" gcDaemonProtection="false"/>
  4. den Hörer deaktivieren

Kredit, wo Kredit fällig ist; Ich erhielt meine erste Antwort von here.

+3

Ich muss den Kommentar im Tomcat Bugzilla-Eintrag für dieses Problem lieben: _ "Standardmäßig wird jetzt ein vollständiger GC ungefähr alle 290 Millionen Jahre vorkommen." _ :) – Matt

3

Sie sollten in der Lage sein, das Intervall zu ändern, indem

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

Werfen Sie einen Blick hier https://docs.oracle.com/cd/E19199-01/817-2180-10/pt_chap5.html

+1

schlagen Sie mich dazu ... und hier http: // docs .oracle.com/javase/6/docs/technotes/guides/rmi/sunrmiproperties.html – Matt

+0

Es sei denn, Tomcat oder eine Webapp in ihm macht RMI Ich sehe nicht, wie dies den geringsten Unterschied machen kann. – EJP

+1

Der Link in der Antwort ist tot. Wayback-Archiv: http://web.archive.org/web/20130330063117/http://ehcache.org/documentation/operations/garbage-collection – Dave

Verwandte Themen