Jak zmínil ckhan, jstack
je skvělé, protože poskytuje úplnou stopu zásobníku všech aktivních vláken v JVM. Totéž lze získat na stderr JVM pomocí SIGQUIT.
Dalším užitečným nástrojem je jmap
který dokáže zachytit výpis haldy z procesu JVM pomocí PID procesu:
jmap -dump:file=/tmp/heap.hprof $PID
Tento výpis haldy lze načíst v nástrojích jako visualvm
(který je nyní součástí standardní instalace Oracle java sdk s názvem jvisualvm). Kromě toho se VisualVM může připojit k běžícímu JVM a zobrazovat informace o JVM, včetně zobrazení grafů interního využití CPU, počtu vláken a využití haldy – skvělé pro sledování úniků.
Další nástroj, jstat
, může shromažďovat statistiky garbage collection pro JVM po určitou dobu podobně jako vmstat, když je spuštěn s číselným argumentem (např. vmstat 3
).
Konečně je možné použít Java Agenta k prosazení instrumentace na všech metodách všech objektů při načítání. Knihovna javassist
může pomoci, aby to bylo velmi snadné. Je tedy možné přidat vlastní trasování. Nejtěžší na tom by bylo najít způsob, jak získat výstup trasování pouze tehdy, když to chcete, a ne stále, což by pravděpodobně zpomalilo JVM na procházení. Existuje program nazvaný dtrace
který funguje takovým způsobem. Zkoušel jsem to, ale nebyl moc úspěšný. Všimněte si, že agenti nemohou instrumentovat všechny třídy, protože ty potřebné k bootstrap JVM jsou načteny dříve, než může agent instrumentovat, a pak je příliš pozdě na to, aby k těmto třídám přidávali instrumentaci.
Můj návrh - začněte s VisualVM a zjistěte, zda vám to řekne, co potřebujete vědět, protože může zobrazit aktuální vlákna a důležité statistiky pro JVM.
Stejně marně při ladění programů, které se v systému Linux pokazily, můžete použít podobné nástroje k ladění běžících JVM ve vašem systému.
Nástroj č. 1 – jvmtop
Podobné jako top
, můžete použít jvmtop, abyste viděli, jaké třídy jsou v rámci běžících JVM ve vašem systému. Po instalaci jej vyvoláte takto:
$ jvmtop.sh
Jeho výstup má podobný styl, aby vypadal jako nástroj top
:
JvmTop 0.8.0 alpha amd64 8 cpus, Linux 2.6.32-27, load avg 0.12
http://code.google.com/p/jvmtop
PID MAIN-CLASS HPCUR HPMAX NHCUR NHMAX CPU GC VM USERNAME #T DL
3370 rapperSimpleApp 165m 455m 109m 176m 0.12% 0.00% S6U37 web 21
11272 ver.resin.Resin [ERROR: Could not attach to VM]
27338 WatchdogManager 11m 28m 23m 130m 0.00% 0.00% S6U37 web 31
19187 m.jvmtop.JvmTop 20m 3544m 13m 130m 0.93% 0.47% S6U37 web 20
16733 artup.Bootstrap 159m 455m 166m 304m 0.12% 0.00% S6U37 web 46
Nástroj č. 2 – jvmmonitor
Další alternativou je použití jvmmonitor. JVM Monitor je Java profiler integrovaný s Eclipse pro monitorování využití CPU, vláken a paměti Java aplikacemi. Můžete jej použít buď k automatickému vyhledání běžících JVM na localhostu, nebo se může připojit ke vzdáleným JVM pomocí [email protected]
Nástroj č. 3 – visualvm
visualvm je pravděpodobně „nástroj“, po kterém sáhnout při ladění problémů s JVM. Jeho sada funkcí je docela hluboká a můžete se podívat na vnitřnosti velmi do hloubky.
Profilujte výkon aplikace nebo analyzujte alokaci paměti:
Převzít a zobrazit výpisy vláken:
Odkazy
- výukový program Visualvm
Zvažte jstack
.Ne úplně odpovídá strace
, spíše pstack
-analogové, ale alespoň vám včas poskytne obrázek snímku. Mohli byste je spojit dohromady, abyste získali hrubou stopu, kdybyste museli.
Viz také návrhy v tomto článku SO:https://stackoverflow.com/questions/1025681/call-trace-in-java