2013-02-15 15 views
29

Prowadzimy wiele serwerów Tomcat i obserwujemy pełne zbiory śmieci (GC) są często wykonywane co godzinę, szczególnie gdy wykorzystanie pamięci jest stosunkowo niskie. Dokładny czas wydaje się być związany z czasem uruchomienia serwera aplikacji; jeśli serwer zostanie uruchomiony o godzinie 01:13, pełny GC zostanie wykonany o 02:13, a następny pełny GC nastąpi o 03:13. Nie udało mi się znaleźć żadnej dokumentacji wyjaśniającej to zachowanie.Dlaczego JVM tych serwerów Tomcat wykonuje pełną godzinę GC?

Jest to problem, ponieważ pula serwerów uruchomiona jednocześnie wszystkie mają tendencję do wykonywania pełnej wartości GC w tym samym czasie. Jeśli opóźnienie GC jest wystarczająco długie, aby spowodować równoważenie obciążenia, aby oznaczyć serwer jako wyłączony, cała aplikacja może przejść w tryb offline na pewien czas. Byłoby lepiej, gdyby pełne GC mogły być dystrybuowane przez pewien czas, więc żadne dwa serwery nie wykonują pełnego GC w tym samym czasie, ale nie mogę znaleźć sposobu kontrolowania tego zachowania.

Czy ktoś inny widział to zachowanie? Czy istnieje jakiś sposób wpływania na te "normalne" pełne GC?

+1

Czy masz proces, który przebiega zgodnie z harmonogramem (przez kwarc, et al.), Które mogą wypełnić w górę sterty na bieżąco? –

Odpowiedz

25

Twój „regularne” GC godzinowe są prawdopodobnie spowodowane this known bugJreMemoryLeakPreventionListener powoduje pełny GC co godzinę, gdy gcDaemonProtection = true”.

Potwierdź wersje Tomcat i wartość właściwości gcDaemonProtection swojej JreMemoryLeakPreventionListener (domyślnie jest to true).

Ta poprawka była rzekomo zawarta w tomcat v.7.0.28 + i v.6.0.36 +.

Albo uaktualnić serwer (y), albo wybrać rozwiązanie bez uaktualniania z here, streścić następująco:

  1. tłumić kolekcji pełen śmieci przy użyciu JVM Arg -XX:+DisableExplicitGC
  2. zachować pełną GCS, ale odroczyć do CMS kolektor przy użyciu JVM arg -XX:+ExplicitGCInvokesConcurrent
  3. ustawić <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" gcDaemonProtection="false"/>
  4. Wyłącz słuchacza

Kredyt, na który należy się kredyt; Otrzymałem pierwszą odpowiedź od here.

+3

Uwielbiam komentarz z wpisu Tomcat Bugzilla dotyczący tego problemu: _ "Domyślnie pełny GC będzie teraz występował mniej więcej co 290 milionów lat." _ :) – Matt

3

powinieneś być w stanie zmienić interwał przez

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

Spójrz tutaj https://docs.oracle.com/cd/E19199-01/817-2180-10/pt_chap5.html

+1

pobili mnie do niego ... i tutaj http: // docs .oracle.com/javase/6/docs/technotes/guides/rmi/sunrmiproperties.html – Matt

+0

O ile Tomcat lub aplikacja webowa w nim nie wykonuje RMI, nie widzę, jak to może zrobić najmniejszą różnicę. – EJP

+1

Link w odpowiedzi jest martwy. Archiwum Wayback: http://web.archive.org/web/20130330063117/http://ehcache.org/documentation/operations/garbage-collection – Dave

Powiązane problemy