2012-06-24 17 views
13

Mamy aplikację internetową działającą w Javie 6, Tomcat 6, Spring Framework 3, Hibernate 4, EhCache. Mamy problem z wyjątkowo długim czasem zbierania śmieci, który może potrwać 30 sekund lub dłużej, pozostawiając aplikację nie odpowiadającą.Niezwykle długie czasy zbierania śmieci

Obecnie jesteśmy w trakcie testowania, ale oprócz oczywistych: dodaj więcej pamięci, zastanawiałem się, czy istnieją aspekty, które możemy dostroić, aby skrócić czas zbierania śmieci.

Głównym czynnikiem wpływającym na wykorzystanie pamięci jest EHCache, ponieważ agresywnie buforujemy. Zawsze jednak trudno jest zmierzyć wielkość sklepów EHCache (nowe rozmiary bajtów EhCache, prowadzą do różnego rodzaju problemów z nami, ponieważ buforowane wykresy obiektów mogą być dość duże).

Są to moje ustawienia dla JVM

JAVA_OPTS="$JAVA_OPTS -server -Xms256m -Xmx704m XX:OnOutOfMemoryError=/usr/share/scripts/on_server_crash.sh -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/tomcat6 -XX:MaxPermSize=192m -XX:+UseConcMarkSweepGC 
+0

Czy otrzymujesz te długie czasy zanim pamięć osiągnie maksimum 704 MB? JVM może być nieco "agresywna" w próbach zredukowania używanej pamięci (i ewentualnie przeniesienia jej) przed podjęciem decyzji o zwiększeniu wykorzystywanej pamięci. Czy zachowuje się tak samo, jeśli uruchamiasz -Xms704m -Xmx704m? –

+0

Używając "jstat -gc 1s pid" można sprawdzić, czy wykorzystanie pamięci trafia do szkółek, czy też należy zmienić przydział pamięci między żłobkami, eden i starszymi. –

+1

Skrócony profil twojej aplikacji z JProdilfer/Yourkit, nie będziesz miał żadnych stałych sugestii. –

Odpowiedz

3

Aby skrócić czas GC, najlepszym, co można zrobić, to użyć off pamięci sterty. Jeśli możesz przenieść jak najwięcej swoich dużych danych, możesz zmniejszyć całkowity czas GC nawet do 10 milisekund, nawet przy 100 s MB wolnej pamięci. Wierzę, że Ehcache wspiera magazyny danych sterty, ale jeśli nie, lub nie możesz ich użyć, sugeruję, abyś spojrzał na alternatywne rozwiązania.

Biorąc pod uwagę, że masz tylko 700 MB maksymalnej wielkości pamięci, wygląda na to, że działasz na serwerze z bardzo ograniczoną pamięcią. W przeciwnym razie proponuję zacząć od maksymalnie 8 lub 16 GB i zmniejszyć rozmiar pamięci, jeśli uważasz, że naprawdę jej nie potrzebujesz.

+0

Rozmiar pamięci nie powinien być problemem w czasach GC. Rozpoczyna się tylko liczba obiektów utworzonych przed rozpoczęciem GC. – user2763361

+1

@ user2763361 Liczba obiektów jest bardzo ważna i inne czynniki, takie jak liczba referencji, które generują odniesienia, ale jest to rozmiar widoczny w narzędziach monitorowania.Jeśli zmniejszysz ilość zużywanej pamięci, możesz poprawić wydajność, ponieważ zazwyczaj oznacza to zmniejszenie liczby obiektów i iluminacji odniesienia. Krótko mówiąc, masz rację, ale użycie pamięci jest łatwiejsze do zmierzenia. –

+0

Dobrze powiedziane. Powiązane: http://stackoverflow.com/questions/21675709/how-to-find-which-objects-are-creating-to-most-garbage – user2763361

1

Istnieje doskonałe narzędzie od osób FourSquare. Sprawdź ten link i szybki przykład, jaki mają. Foursquare Heap tool.. W oparciu o diagnostykę, którą można znaleźć w dowolnym z wyżej wymienionych narzędzi, najbardziej posortowanym rozwiązaniem problemu jest dodanie większej ilości pamięci RAM lub zwiększenie mocy procesora CPU. Jeśli jesteś otwarty na niektóre zmiany w infrastrukturze, sprawdź Zing from Azul Systems. Ale myślę, że druga opcja może być trudna.

Powiązane problemy