Автор оригинала: Pankaj Kumar.
Дамп потоков Java – это список всех потоков, активных в JVM.
Дамп потоков Java
Дамп потоков Java очень полезен при анализе узких мест в приложении и ситуаций взаимоблокировки.
Здесь мы изучим несколько способов, с помощью которых мы можем генерировать дамп потока для java-программы. Эти инструкции действительны для операционных систем *nix, но в Windows шаги могут немного отличаться.
- Профилировщик VisualVM : Если вы анализируете приложение на предмет медлительности, вы должны использовать профилировщик. Мы можем очень легко сгенерировать дамп потока для любого процесса с помощью профилировщика VisualVM. Вам просто нужно щелкнуть правой кнопкой мыши на запущенном процессе и выбрать опцию “Дамп потока”, чтобы сгенерировать его.
jstack : Java поставляется с jstack инструментом, с помощью которого мы можем создавать дамп потоков для процесса java. Это двухэтапный процесс.
- Узнайте PID процесса java с помощью команды
ps -eaf | grep java
- Runjstacktool как
jstack PID
для создания вывода дампа потока на консоль вы можете добавить вывод дампа потока в файл с помощью команды ”jstack PID >> mydumps.tdump
“
- Узнайте PID процесса java с помощью команды
- Мы можем использовать команду
kill -3 PID
для создания дампа потока. Это немного отличается от других способов создания дампа потоков. Когда выдается команда kill, в Систему из программы генерируется дамп потока. Поэтому, если это java-программа с консолью в качестве системы, дамп потока будет напечатан на консоли. Если java-программа представляет собой сервер Tomcat с выходом системы какcatalina.out
, то в файле будет сгенерирован дамп потока. - В Java 8 появилась утилита
jcmd
. Вы должны использовать это вместо jstack, если вы используете Java 8 или выше. Команда для создания дампа потока с помощью jcmd-этоjcmd PID Thread.print
.
Выше приведены четыре различных способа создания дампа потоков в java. Обычно я предпочитаю команду jstack или jcmd для создания дампа потока и анализа. Обратите внимание, что какой бы способ вы ни выбрали, дамп потока всегда будет одним и тем же.
Пример Дампа потока Java
В моем последнем посте я объяснил о таймере java, вот дамп потока , созданный для той же программы.
2012-12-26 22:28:39 Full thread dump Java HotSpot(TM) 64-Bit Server VM (23.5-b02 mixed mode): "Attach Listener" daemon prio=5 tid=0x00007fb7d8000000 nid=0x4207 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Timer-0" daemon prio=5 tid=0x00007fb7d4867000 nid=0x5503 waiting on condition [0x00000001604d9000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at com.journaldev.threads.MyTimerTask.completeTask(MyTimerTask.java:19) at com.journaldev.threads.MyTimerTask.run(MyTimerTask.java:12) at java.util.TimerThread.mainLoop(Timer.java:555) at java.util.TimerThread.run(Timer.java:505) "Service Thread" daemon prio=5 tid=0x00007fb7d482c000 nid=0x5303 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE "C2 CompilerThread1" daemon prio=5 tid=0x00007fb7d482b800 nid=0x5203 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "C2 CompilerThread0" daemon prio=5 tid=0x00007fb7d4829800 nid=0x5103 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Signal Dispatcher" daemon prio=5 tid=0x00007fb7d4828800 nid=0x5003 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Finalizer" daemon prio=5 tid=0x00007fb7d4812000 nid=0x3f03 in Object.wait() [0x000000015fd26000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x0000000140a25798> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) - locked <0x0000000140a25798> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:177) "Reference Handler" daemon prio=5 tid=0x00007fb7d4811800 nid=0x3e03 in Object.wait() [0x000000015fc23000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x0000000140a25320> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:503) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133) - locked <0x0000000140a25320> (a java.lang.ref.Reference$Lock) "main" prio=5 tid=0x00007fb7d5000800 nid=0x1703 waiting on condition [0x0000000106116000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at com.journaldev.threads.MyTimerTask.main(MyTimerTask.java:33) "VM Thread" prio=5 tid=0x00007fb7d480f000 nid=0x3d03 runnable "GC task thread#0 (ParallelGC)" prio=5 tid=0x00007fb7d500d800 nid=0x3503 runnable "GC task thread#1 (ParallelGC)" prio=5 tid=0x00007fb7d500e000 nid=0x3603 runnable "GC task thread#2 (ParallelGC)" prio=5 tid=0x00007fb7d5800000 nid=0x3703 runnable "GC task thread#3 (ParallelGC)" prio=5 tid=0x00007fb7d5801000 nid=0x3803 runnable "GC task thread#4 (ParallelGC)" prio=5 tid=0x00007fb7d5801800 nid=0x3903 runnable "GC task thread#5 (ParallelGC)" prio=5 tid=0x00007fb7d5802000 nid=0x3a03 runnable "GC task thread#6 (ParallelGC)" prio=5 tid=0x00007fb7d5802800 nid=0x3b03 runnable "GC task thread#7 (ParallelGC)" prio=5 tid=0x00007fb7d5803800 nid=0x3c03 runnable "VM Periodic Task Thread" prio=5 tid=0x00007fb7d481e800 nid=0x5403 waiting on condition JNI global references: 116
Дамп потока-это список всех потоков, в каждой записи отображается информация о потоке, которая включает в себя следующее в порядке появления.
- Имя потока : Имя потока
- Приоритет потока : Приоритет потока
- Идентификатор потока : Представляет уникальный идентификатор потока
- Состояние потока : Указывает текущее состояние потока , например, ВЫПОЛНЯЕТСЯ, ОЖИДАЕТ, ЗАБЛОКИРОВАН. При анализе взаимоблокировки ищите заблокированные потоки и ресурсы, на которых они пытаются получить блокировку.
- Стек вызовов потока : Предоставляет жизненно важную информацию о стеке для потока. Это место, где мы можем видеть блокировки, полученные потоком, и если он ожидает какой-либо блокировки.
Это все для дампа потоков в java.