Użycie parametru HeapDumpOnOutOfMemoryError dla zrzutu sterty dla JBoss

182

Powiedziano mi, że mogę dodać -XX:+HeapDumpOnOutOfMemoryErrorparametr do opcji uruchamiania JVM do skryptu uruchamiania JBoss, aby uzyskać zrzut stosu, gdy wystąpi błąd braku pamięci w naszej aplikacji. Zastanawiałem się, gdzie te dane zostaną zrzucone? Czy to tylko konsola, czy plik dziennika? Jeśli chodzi tylko o konsolę, co się stanie, jeśli nie zaloguję się do serwera Unix za pośrednictwem konsoli?

Dmitrij Trunow
źródło
1
To chyba bieżący folder.
Valentin Tihomirov,

Odpowiedzi:

246

Oto, co ma do powiedzenia dokumentacja Oracle :

Domyślnie zrzut sterty jest tworzony w pliku o nazwie java_ pid .hprof w katalogu roboczym maszyny wirtualnej, jak w powyższym przykładzie. Możesz podać alternatywną nazwę pliku lub katalog z -XX:HeapDumpPath=opcją. Na przykład -XX:HeapDumpPath=/disk2/dumps spowoduje wygenerowanie zrzutu sterty w /disk2/dumps katalogu.

Matt Solnit
źródło
16
Zawiera również listę wszystkich opcji związanych z wydajnością maszyn wirtualnych: java.sun.com/javase/technologies/hotspot/…
Ravi Gupta
4
Ważny! Flagi HeapDump są dostępne tylko w Javie 1.5.0_07.
rustyx
14
Ważne jest również, aby rozpoznać, że JVM NIE nadpisze istniejącego zrzutu sterty w HeapDumpPath, zobaczysz coś podobnego do tego "Unable to create /tmp/java_pidpid.hprof: File exists"w twoim standardzie. Pamiętaj, aby przenieść plik zrzutu ze ścieżki zrzutu, aby wyczyścić drogę dla przyszłych plików zrzutu; i użyj <pid>symbolu zastępczego w nazwie pliku, aby zwiększyć entropię w nazwie pliku.
Ben
1
To było bardzo przydatne. Znalezienie przecieku za pomocą Eclipse Memory Analyzer zajęło zaledwie kilka minut.
Aron Lorincz,
Co się stanie, jeśli podamy ścieżkę do folderu, który nie istnieje w systemie? Czy utworzy folder i wrzuci zrzut zrzutu w tym folderze?
Vinit89
47

Możesz wyświetlić ten zrzut z konsoli UNIX.

Ścieżka zrzutu zrzutu zostanie podana jako zmienna zaraz po tym, jak umieściłeś wspomnianą zmienną.

Na przykład:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${DOMAIN_HOME}/logs/mps"

Możesz wyświetlić zrzut z konsoli na wspomnianej ścieżce.

Swaminathan Krishnamoorthi
źródło
4

Trudno mi było odczytać, co oznacza „katalog roboczy maszyny wirtualnej”. W moim przykładzie używałem programu Java Service Wrapper do wykonania jar - pliki zrzutu zostały utworzone w katalogu, w którym umieściłem program otoki, np. C: \ myapp \ bin. Powodem, dla którego to odkryłem, jest to, że pliki mogą być dość duże i zapełniły dysk twardy, zanim odkryłem ich lokalizację.

B5A7
źródło
Twój katalog roboczy można znaleźć za pomocą komendy pwdx <PID>. Najpierw wykonaj ps -ef | grep java, znajdź swój PID dla aplikacji Java, a następnie uruchom pwdx <PID>. Powie ci katalog roboczy.
RCG,
2

Jeśli nie używasz opcji „-XX: HeapDumpPath”, to w przypadku JBoss EAP / As domyślnie plik zrzutu sterty zostanie wygenerowany w katalogu „JBOSS_HOME / bin”.

Swapnil Chaudhari
źródło