Як згадував ckhan, jstack
він чудовий тим, що дає повний слід стека всіх активних потоків у JVM. Те ж саме можна отримати на stderr JVM за допомогою SIGQUIT.
Іншим корисним інструментом є те, jmap
що може схопити звалище з процесу JVM, використовуючи PID процесу:
jmap -dump:file=/tmp/heap.hprof $PID
Цей visualvm
накопичувальний накопичувач може бути завантажений у такі інструменти (що зараз є частиною стандартної установки Oracle java sdk під назвою jvisualvm). Крім того, VisualVM може підключатися до запущеного JVM та відображати інформацію про JVM, включаючи показ графіків внутрішнього використання процесора, кількості потоків та використання купи - відмінно підходить для відстеження витоків.
Інший інструмент, jstat
- може збирати статистику збору сміття для JVM протягом певного періоду часу, подібно до vmstat при запуску з числовим аргументом (наприклад vmstat 3
).
Нарешті, можна використовувати Агент Java для просування інструментарію для всіх методів усіх об'єктів під час завантаження. Бібліотека javassist
може допомогти зробити це дуже просто. Отже, можливо додати власну кальку. Важкою частиною цього є пошук способу отримати вихідний слід лише тоді, коли ви цього хотіли, а не весь час, що, швидше за все, сповільнить JVM до сканування. Існує програма під назвою, dtrace
яка працює таким чином. Я спробував це, але не дуже вдало. Зауважте, що агенти не можуть інструментувати всі класи, тому що ті, які потрібні для завантаження JVM, завантажуються до того, як агент може інструментувати, і тоді вже пізно додати інструментарій до цих класів.
Моя пропозиція - почніть з VisualVM і подивіться, чи це говорить вам про те, що вам потрібно знати, оскільки він може показувати поточні потоки та важливу статистику для JVM.