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?

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.


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”)


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.


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”


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


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.