Mylisz dwa różne zrzuty Java. kill -3
generuje zrzut wątku, a nie zrzut stosu.
Zrzut wątku = ślady stosu dla każdego wątku w wyjściu JVM na standardowe wyjście jako tekst.
Zrzut hałdy = zawartość pamięci dla wyniku procesu JVM w pliku binarnym.
Aby wykonać zrzut wątku w systemie Windows, CTRL+ BREAKjeśli JVM jest procesem pierwszego planu, jest najprostszym sposobem. Jeśli masz uniksopodobną powłokę w systemie Windows, taką jak Cygwin lub MobaXterm, możesz używać jej kill -3 {pid}
tak, jak w Uniksie.
Aby wykonać zrzut wątku w Uniksie, CTRL+ Cjeśli JVM jest procesem na pierwszym planie lub kill -3 {pid}
będzie działał, dopóki dostaniesz odpowiedni PID dla JVM.
Na obu platformach Java jest dostarczana z kilkoma narzędziami, które mogą pomóc. W przypadku zrzutów wątków jstack {pid}
jest to najlepszy wybór. http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html
Aby zakończyć pytanie o zrzut: zrzuty hałdy nie są powszechnie używane, ponieważ są trudne do interpretacji. Ale zawierają wiele przydatnych informacji, jeśli wiesz, gdzie / jak na nie spojrzeć. Najczęstszym zastosowaniem jest zlokalizowanie wycieków pamięci. Dobrą praktyką jest ustawienie -D
wiersza polecenia java, aby zrzut sterty był generowany automatycznie po wystąpieniu błędu OutOfMemoryError, -XX:+HeapDumpOnOutOfMemoryError
ale można również ręcznie wywołać zrzut sterty. Najczęstszym sposobem jest użycie narzędzia Java jmap
.
UWAGA: to narzędzie nie jest dostępne na wszystkich platformach. Od wersji JDK 1.6 jmap
jest dostępny w systemie Windows.
Przykładowy wiersz poleceń wyglądałby podobnie
jmap -dump:file=myheap.bin {pid of the JVM}
Wyjściowy plik „myheap.bin” nie jest czytelny dla człowieka (dla większości z nas) i będziesz potrzebować narzędzia do jego analizy. Moje preferencje to MAT. http://www.eclipse.org/mat/