2010-08-19 16 views
21

to wyglądaTomcat na serwerze produkcyjnym, PermGen i redeploys

MemoryError: PermGen space 
java.lang.OutOfMemoryError: PermGen space 

jest częstym problemem. Możesz zwiększyć rozmiar swojego wolnego miejsca, ale po 100 lub 200 odsłonach będzie on pełny. Śledzenie wycieków pamięci ClassLoader jest prawie niemożliwe.

Jakie są twoje metody dla Tomcat (lub innego prostego kontenera serwletów - Jetty?) Na serwerze produkcyjnym? Czy serwer jest restartowany po każdym wdrożeniu rozwiązania?

Czy używasz jednego Tomcat do wielu zastosowań?

Może powinienem używać wielu serwerów Jetty na różnych portach (lub wbudowanym pomoście) i za każdym razem cofać/restartować/wdrażać?

+0

Czy próbowałeś zwiększyć rozmiar sterty? – vsingh

+0

To nie jest problem wielkości sterty, ale problem rozładowania kodu bajtowego klasy. Mówią, że klasy nie są rozładowywane w JVM, a przestrzeń PermGen nie jest przeciągnięta. –

Odpowiedz

6

Zrezygnowałem z używania menedżera tomcat i teraz zawsze zamykam tomcat, aby ponownie wdrożyć.

Uruchomimy dwa koty na tym samym serwerze i używamy serwera WWW apache z mod_proxy_ajp, aby użytkownicy mieli dostęp do obu aplikacji przez ten sam port 80. Jest to miłe również dlatego, że użytkownicy widzą stronę Usługa niedostępna dla Apache, gdy kocioł jest wyłączony.

+1

Używamy dwóch tomcatów na różnych portach za HAProxy, aby zapewnić niebiesko-zielone rozwiązanie wdrożeniowe. Serwer "niebieski" jest wyłączany, gdy "zielony" jest uruchomiony, a HAProxy przechodzi w "zielony". Następna instalacja zostanie przeniesiona do "niebieskiego". –

2

Tak, rzeczywiście, jest to problem. Prowadzimy trzy aplikacje internetowe na serwerze Tomcat: nr 1 korzysta ze struktury aplikacji internetowych, Hibernate i wielu innych JAR-ów, nie. 2 używa Hibernate i kilku JARów i nie. 3 to w zasadzie bardzo prosta aplikacja JSP.

Kiedy wdrażamy nie. 1, zawsze restartujemy Tomcat. W przeciwnym razie błąd miejsca PermGen wkrótce nas ugryzie. Nr 2 może czasami być wdrożony bez problemu, ale ponieważ często zmienia się, gdy nie. 1 również, i tak zaplanowano restart. Nr 3 nie stanowi żadnego problemu i może być wdrożony tak często, jak jest to konieczne, bez problemu.

Tak, tak, zazwyczaj restartujemy Tomcat. Ale czekamy również na Tomcat 7, który ma obsłużyć wiele problemów związanych z ładowarką pamięci/klas, które są pochowane w różnych JAR i frameworkach innych firm.

3

Można spróbować dodać te opcje Java:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 

Umożliwia to zbieranie śmieci w przestrzeni PermGen (domyślnie wyłączone) i pozwala na GC do rozładunku klas. Dodatkowo powinieneś użyć -XX: PermSize = 64m -XX: MaxPermSize = 128m wspomnianych gdzie indziej, aby zwiększyć ilość dostępnego PermGena.

+2

W jaki sposób mają pomóc? – vsingh

1

Powinieneś włączyć PermGen garbage collection. Domyślnie maszyna wirtualna Hotspot NIE zbiera śmieci PermGen, co oznacza, że ​​wszystkie wczytane pliki klas pozostają w pamięci na zawsze. Każde nowe wdrożenie ładuje nowy zestaw plików klas, co oznacza, że ​​w końcu zabraknie przestrzeni PermGen.

+0

Jak odnotowano w @Soundlink, parametrami włączania GC w PermGen są "-XX: + CMSClassUnloadingEnabled -XX: + CMSPermGenSweepingEnabled". W Ubuntu możesz dodać je do JAVA_OPTS w/etc/default/tomcat6. – werkshy

2

Przełączniki PermGen w HotSpot tylko opóźniają problem, a ostatecznie i tak otrzymasz OutOfMemoryError.

Mamy ten problem przez długi czas, a jedynym rozwiązaniem, które znalazłem do tej pory, jest użycie JRockit. Nie ma PermGenu, więc problem po prostu znika. Oceniamy to teraz na naszych serwerach testowych i od czasu przełączenia nie mieliśmy żadnego problemu PermGen. Próbowałem też powtórzyć więcej niż 20 razy na mojej lokalnej maszynie z aplikacją, która otrzymała ten błąd podczas pierwszej redepozycji i wszystko pięknie się potoczyło.

JRockit ma być zintegrowany z OpenJDK, więc być może ten problem zniknie również w przypadku Java w przyszłości.

http://www.oracle.com/technetwork/middleware/jrockit/overview/index.html

I to za darmo, w ramach tej samej licencji jak HotSpot:

https://blogs.oracle.com/henrik/entry/jrockit_is_now_free_and

+0

Myślałem, że JRockit trzyma definicje klas na stercie. Czy twoja kupka nie rośnie po każdej zmianie? Co "JRockit Mission Control" pokazuje o wielkości sterty? –

+0

Po każdym ponownym rozmieszczeniu sterta pozostaje w tym samym rozmiarze, o ile widzę. Próbowałem ponownie z około 10 zmianami teraz. –

1

Która wersja Tomcat używasz? Tomcat 7 i 6.0.30 mają wiele funkcji pozwalających uniknąć tych wycieków lub przynajmniej ostrzegają o ich przyczynie.

This presentation autorstwa Marka Thomasa z SpringSource (i długoletniego uczestnika Tomkata) w tej sprawie jest bardzo interesująca.

+0

Pytanie zadano w 2010 roku. Tomcat 7 był wtedy w planach. Nasze rozwiązanie to aplikacja, która wyłączyła kocur, kopiuje stare WAR do kopii zapasowej, pobiera nowe WAR z Hudson, uruchamia Tomcat. Używamy dwóch tomcatów i niebiesko-zielonego wzoru rozmieszczenia. –

1

Odsyłaczem jest nowa wersja narzędzia Plumbr, która może monitorować i wykrywać przecieki w Generacyjnej Generacji.

Powiązane problemy