Czy istnieje sposób na uniknięcie wycieków pamięci w Tomcat?

To pytanie jest dla każdego, kto kiedykolwiek testował przycisk "Znajdź przecieki" w Menedżerze Tomcat i uzyskał takie wyniki:

Następujące aplikacje webowe zostały zatrzymane (reloaded, undeployed), ale ich klasy z poprzednich uruchomień są nadal ładowane do pamięci, powodując wyciek pamięci (użyj profilera, aby potwierdzić):
/ leaky-app-name

Zakładam, że ma to coś wspólnego z tym błędem" Perm Gen space", który często pojawia się przy częstym przesunięcia.

Więc to, co widzę w jconsole, kiedy rozmieszczam jest to, że moje załadowane klasy idą z około 2k do 5k. wtedy można by pomyśleć, że nieprzystosowanie powinno zrzucić je z powrotem do 2k, ale pozostają na 5k.

Próbowałem również użyć następujących opcji JVM:

-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled

Widziałem bardzo drobne spadki w ilości użytej przestrzeni genowej Perm, ale nie tego się spodziewałem, a załadowane klasy nie spadły.

Czy jest sposób na konfigurację Tomcat ' a lub zaprojektowanie swojego aplikacja do lepszego rozładunku w przypadku niewypełnienia? A może utknęliśmy z ponownym uruchomieniem serwera po kilku ważnych sesjach debugowania?

Wyjście wersji Tomcat:

Wersja serwera: Apache Tomcat/6.0.29
Serwer zbudowany: 19 lipca 2010 1458
Numer serwera: 6.0.0.29
Nazwa systemu operacyjnego: Windows 7
Wersja systemu operacyjnego: 6.1
Architektura: x86
Wersja JVM: 1.6.0_18-b07
Producent JVM: Sun Microsystems Inc.

Update:

Dzięki odpowiedzi celiasa postanowiłem trochę poszperać i chyba ustaliłem winowajcę, że będzie w mojej aplikacji dzięki CXF, Spring i JAXB.

Po tym, jak nauczyłem się profilować aplikację Java, skierowałem profiler na Tomcat i zrobiłem kilka zrzutów i migawek, aby zobaczyć, jak obiekty i klasy wyglądają w pamięci. Odkryłem, że niektóre wyliczenia z mojego schematu XML używane w moim CXF / JAXB (wsdl2java) generowane klasy utrzymywały się po nieprzystosowaniu. Według mojego wysypiska wygląda na to, że obiekty były powiązane z mapą. Zastrzeżenie: przyznaję, że nadal jestem trochę zielony z profilowanie i śledzenie drzewa wywołania obiektu może być trudne w Javie.

Powinienem też wspomnieć, że nawet nie powołałem się na Serwis, tylko wdrożyłem go, a następnie go nie wdrożyłem. Same obiekty zdawały się być ładowane poprzez odbicie zainicjowane od wiosny w trakcie rozmieszczenia. Wierzę, że podążałem za konwentem dla uruchomienie usługi CXF na wiosnę. Nie jestem więc w 100% pewien, czy to wina Spring / CXF, JAXB, czy reflection.

Na marginesie: dana aplikacja jest usługą internetową używającą Spring / CXF, a XML jest dość skomplikowanym schematem (rozszerzenie niem).

Author: waltwood, 2010-12-30

2 answers

Jeśli chcesz się upewnić, że nie powoduje wycieków, musisz wykonać następujące czynności:

  • Upewnij się, że Twoja aplikacja internetowa nie używa klas java, które znajdują się w bibliotekach współdzielonych kontenera sieciowego. Jeśli masz jakieś biblioteki współdzielone, upewnij się, że nie ma silnych odniesień do obiektów w tych bibliotekach
  • Unikaj używania zmiennych statycznych, zwłaszcza w obiektach java, takich jak HashTable, Sets, itp. Jeśli musisz, upewnij się, że wywołujesz polecenie Usuń, aby zwolnić obiekty z mapami, listy...

Tutaj jest również dobry artykuł na temat ThreadLocal i MemoryLeaks - http://blog.arendsen.net/index.php/2005/02/22/threadlocals-and-memory-leaks-revisited/

 15
Author: celias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-19 22:24:45

Tomcat 7 ma przynieść ulepszenia w tym obszarze. Zobacz Funkcje Apache Tomcat 7 , sekcja zatytułowana Koniec z przeciekami!

Wierzą, że poradzą sobie z wieloma wyciekami pamięci spowodowanymi przez aplikacje internetowe. Niestety, wciąż jest w wersji beta.

Poza tym, mogę po prostu powiedzieć, że zrobiłem to samo doświadczenie i nie znalazłem rozwiązania. Wdrożenie zwykle wymaga ponownego uruchomienia programu Tomcat. Nie mam pojęcia kto jest winowajcą: moja sieć aplikacja, Tomcat, Hibernate, gobelin lub kilka z nich.

 6
Author: Codo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-30 18:32:24