Jak analizować plik .hprof?

227

Mam serwer produkcyjny z następującą flagą: - XX: + HeapDumpOnOutOfMemoryError

Ostatniej nocy wygenerował plik java-38942.hprof, gdy nasz serwer napotkał błąd sterty. Okazuje się, że twórcy systemu wiedzieli o fladze, ale nie ma sposobu, aby uzyskać z niej użyteczne informacje.

Jakieś pomysły?

Nick Stinemon
źródło

Odpowiedzi:

215

Jeśli chcesz dość zaawansowanego narzędzia do poważnego przeszukiwania, spójrz na projekt Memory Analyzer w Eclipse, do którego przyczynił się SAP.

Niektóre z rzeczy, które możesz zrobić, są zadziwiająco dobre do znajdowania wycieków pamięci itp. - w tym uruchomienie formy ograniczonego SQL (OQL) przeciwko obiektom w pamięci, tj.

Wybierz toString (firstName) FROM com.yourcompany.somepackage.User

Całkowicie genialny.

Cowan
źródło
18
Chciałbym tylko dodać +100 do Eclipse Memory Analyzer. Obecnie próbuję przesiać przez plik zrzutu pamięci o wielkości 400 MB +, a odczytanie pliku zajęło ponad 70 minut, zanim spowodowało to całkowitą awarię JVM. EMA jest w stanie otworzyć go w <5 minut.
matt b
3
Podczas otwierania plików HPROF za pomocą Eclipse Memory Analyzer ciągle pojawiają się błędy analizy (które w rzeczywistości zostały również zrzucone przez Eclipse!). Niestety ... westchnienie.
lost_bits1110,
3
MAT nadal może wymagać sporo pamięci RAM [mniej niż JHAT, ale wciąż sporo]. Zobacz stackoverflow.com/questions/7254017/…, aby uzyskać wskazówki, jeśli napotkasz takie zdarzenie.
rogerdpack
71

Możesz użyć JHAT , Java Heap Analysis Tool dostarczanego domyślnie z JDK. Jest to wiersz poleceń, ale uruchamia serwer WWW / przeglądarkę, której używasz do badania pamięci. Nie jest najbardziej przyjazny dla użytkownika, ale przynajmniej jest już zainstalowany w większości miejsc, do których pojedziesz. Bardzo przydatnym widokiem jest link „histogram sterty” na samym dole.

dawny: jhat -port 7401 -J-Xmx4G dump.hprof

jhat może również wykonywać OQL „w tych dniach” (dolny link „wykonaj OQL”)

CMS
źródło
Po uruchomieniu powyższego polecenia W konsoli pojawi się komunikat „terminal jest gotowy” na serwerze: Port: 7401. Następnie otwórz ten adres URL: localhost: 7401 „możesz zobaczyć szczegóły w oknach przeglądarki”.
Laxman G
35

Możesz także użyć HeapWalker z Netbeans Profiler lub autonomicznego narzędzia Visual VM . Visual VM jest dobrą alternatywą dla JHAT, ponieważ jest samodzielny, ale jest znacznie łatwiejszy w użyciu niż JHAT.

Potrzebujesz Java 6+, aby w pełni korzystać z Visual VM.

James Schek
źródło
Należy dodać uwagę, że dotyczy to tylko Java 6 i 7.
Nick Stinemon,
AFAIK, HeapWalker i VisualVM nie wymagają Java 6/7 do odczytu plików HPROF.
James Schek
Właśnie próbowałem załadować go z Javą 5 i było napisane „Proszę używać Java 6 lub 7”. Co robię źle?
Nick Stinemon,
Hmm Być może musisz uruchomić Javę 6, ale możesz odczytać HPROF Java 5 (być może tak to działa). Wiem, że nie można utworzyć zrzutu stosu z Visual VM w aplikacji z uruchomioną Javą 5. Zostanie zaktualizowany.
James Schek
Możesz także użyć wizualnej JVM z Java SDK - poszukaj jvisualvm.exew JAVASDK/binfolderze
xxxvodnikxxx
11

Po prostu pobierz Eclipse Memory Analyzer . Nie ma nic lepszego i jest za darmo.

JHAT nadaje się tylko do „zabawek”

kalarepa
źródło
3
JHAT jest niezbędny, aby zaimponować hakerom „l33t”, którzy ręcznie budują dystrybucję BSD, zaczynając od LILO. Czekaj ... i tak nigdy by nie użyli javy. :-)
James Schek
Myślę, że to bardziej komentarz ...: \
rogerdpack
10

Wygląda na to, że YourKit Java Profiler też je obsługuje.

Polaris
źródło
5

Jeśli chcesz wykonać niestandardową analizę zrzutu, możesz:

Ta biblioteka jest szybka, ale musisz napisać kod analizy w Javie.

Z dokumentów:

  • Nie tworzy na dysku żadnych plików tymczasowych w celu przetworzenia zrzutu sterty
  • Może pracować bezpośrednio, zrzuty sterty skompresowane GZ
  • Notacja HeapPath
Andrejs
źródło
2

Osobiście wolę VisualVM. Jedną z funkcji, które lubię w VisualVM, jest porównywanie zrzutów sterty. Podczas przeprowadzania analizy zrzutu stosu istnieje wiele sposobów, aby dowiedzieć się, co spowodowało awarię. Jednym ze sposobów, które uznałem za przydatne, jest porównanie zdrowych i niezdrowych zrzutów sterty.

Oto kroki, które możesz w tym celu wykonać:

  1. Otrzymanie zrzutu stosu OutOfMemoryError nazwijmy to „oome.hprof”. Można to uzyskać za pomocą parametru JVM HeapDumpOnOutOfMemoryError.
  2. Uruchom ponownie aplikację, aby działała przez długi czas (minuty / godziny) w zależności od aplikacji. Uzyskaj kolejny zrzut sterty, gdy aplikacja jest nadal uruchomiona. Nazwijmy to „zdrowym. Hprof”.
  3. Możesz otworzyć oba te zrzuty w VisualVM i wykonać porównanie zrzutu. Możesz to zrobić na poziomie klasy lub pakietu. Może to często wskazywać kierunek problemu.

link: https://visualvm.github.io

Waleed
źródło