Zwykle to, czego używam, jest ParseHeapDump.sh
zawarte w Eclipse Memory Analyzer i opisane tutaj , i robię to na jednym z naszych bardziej rozbudowanych serwerów (pobierz i skopiuj przez dystrybucję linux .zip, rozpakuj tam). Skrypt powłoki potrzebuje mniej zasobów niż parsowanie sterty z GUI, a ponadto można go uruchomić na mocnym serwerze z większą ilością zasobów (można przydzielić więcej zasobów, dodając coś podobnego -vmargs -Xmx40g -XX:-UseGCOverheadLimit
na końcu ostatniej linii skryptu. Na przykład: ostatnia linia tego pliku może wyglądać tak po modyfikacji
./MemoryAnalyzer -consolelog -application org.eclipse.mat.api.parse "$@" -vmargs -Xmx40g -XX:-UseGCOverheadLimit
Uruchom to jak ./path/to/ParseHeapDump.sh ../today_heap_dump/jvm.hprof
Po pomyślnym zakończeniu tworzy kilka plików „indeksowych” obok pliku .hprof.
Po utworzeniu indeksów próbuję generować raporty z tego i przesyłać je do moich lokalnych maszyn i próbuję sprawdzić, czy mogę znaleźć winowajcę tylko przez to (nie tylko raporty, nie indeksy). Oto samouczek dotyczący tworzenia raportów .
Przykładowy raport:
./ParseHeapDump.sh ../today_heap_dump/jvm.hprof org.eclipse.mat.api:suspects
Inne opcje raportów:
org.eclipse.mat.api:overview
i org.eclipse.mat.api:top_components
Jeśli te raporty nie wystarczą i potrzebuję więcej kopania (np. Przez oql), przeskakuję indeksy, a także plik hprof na moją maszynę lokalną, a następnie otwieram zrzut sterty (z indeksami w tym samym katalogu co zrzut sterty) z moim GUI Eclipse MAT. Stamtąd nie potrzebuje zbyt dużej ilości pamięci do uruchomienia.
EDYCJA:
po prostu lubiłem dodać dwie notatki:
- O ile wiem, tylko generowanie indeksów jest częścią intensywnie korzystającą z pamięci Eclipse MAT. Po uzyskaniu indeksów większość przetwarzania z Eclipse MAT nie wymagałoby tak dużej ilości pamięci.
- Zrobienie tego na skrypcie powłoki oznacza, że mogę to zrobić na serwerze bezgłowym (i zwykle robię to również na serwerze bezgłowym, ponieważ zwykle są one najpotężniejsze). A jeśli masz serwer, który może wygenerować zrzut sterty o takim rozmiarze, prawdopodobnie masz inny serwer, który może również przetworzyć tak dużą część zrzutu sterty.
ArrayIndexOutOfBoundsException
Wyposażony w conajmniej dwóch błędów . Mówię to, ponieważ nie zgłosiłeś OOME podczas uruchamiania MAT, który ma inną poprawkę .