Java 스레드 덤프 - VisualVM, jstack, kill -3, jcmd
Java 스레드 덤프는 JVM에서 활성화된 모든 스레드 목록입니다.
자바 스레드 덤프
Java 스레드 덤프는 응용 프로그램의 병목 현상 및 교착 상태 분석에 매우 유용합니다. 여기에서 우리는 Java 프로그램에 대한 스레드 덤프를 생성할 수 있는 여러 가지 방법을 배웁니다. 이러한 지침은 *nix 운영 체제에 유효하지만 Windows에서는 단계가 약간 다를 수 있습니다.

위는 Java에서 스레드 덤프를 생성하는 네 가지 방법입니다. 일반적으로 스레드 덤프를 생성하고 분석하기 위해 jstack 또는 jcmd 명령을 선호합니다. 어떤 방법을 선택하든 스레드 덤프는 항상 동일합니다.
Java 스레드 덤프 예
저번 포스팅에서 java Timer에 대해 설명했는데, 여기 같은 프로그램에 대해 생성된 쓰레드 덤프가 있습니다.
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
스레드 덤프는 모든 스레드의 목록이며, 모든 항목은 나타나는 순서대로 다음을 포함하는 스레드에 대한 정보를 보여줍니다.
- 스레드 이름: 스레드 이름
- 스레드 우선순위: 스레드의 우선순위
- 스레드 ID: 스레드의 고유 ID를 나타냄
- 스레드 상태: 현재 스레드 상태(예: RUNNABLE, WAITING, BLOCKED)를 제공합니다. 교착 상태를 분석하는 동안 잠금을 획득하려는 차단된 스레드 및 리소스를 찾습니다.
- 스레드 호출 스택: 스레드에 대한 중요한 스택 정보를 제공합니다. 여기에서 Thread가 획득한 잠금과 잠금을 기다리고 있는지 확인할 수 있습니다.
이것이 자바의 스레드 덤프에 대한 전부입니다.