본문 바로가기

네트워크 프로그래밍/Thread

[박혜웅] Java Stack Trace


위 그림은 Java Thread Dump를 통하여, 2개의 스레드 상태를 출력한 화면이다.
2개의 스레드를 생성한 후, synchronized블럭을 사용하여 동기화시켰으며, 현재 myThread-2는 실행중(RUNNABLE)이며, myThread-1은 lock을 얻지 못해 블럭된(BLOCKED) 상태이다.

CPU에 의한 수행과정은 화살표처럼 아래부터 위로 올라가면서 수행되는 것이다. 따라서 가장 위의 내용이 thread stack의 가장 윗 내용과 같다.

빨간 박스의 내용은 스레드에 대한 정보로서, "myThread-1"을 살펴보면,
"myThread-1":  스레드 이름이며 Thread.setName()을 통해 언제든지 변경할 수 있다.(Thread.start() 이후에도..)
"prio=6" 스레드 중요도로서 1~10사이의 값을 가지며 기본값은 5이다. (하지만 1로 설정했다고 해도 JVM이 2로 세팅할 수도 있다. -_-;)
"tid=0x01a35000": OS마다 값 생성 방법이 다르며, Linux의 경우에는 pid이고 Windows의 경우에는 자체적인 고유번호이다.
"nid=0x1d6c": 이 스레드의 객체가 할당된 메모리 포인터이다.
"waiting for monitor entry": 현재 상태정보이며, synchronized블럭에 의해 동기화되었으므로 monitor라는 용어가 보인다.

파란 박스의 내용은 스레드 스택에 대한 정보로서,
"java.lang.Thread.State: BLOCKED": 현재 스레드의 상태를 나타낸다.
"waiting to lock <0x33765e38> (a. java.lang.String)": 현재 lock을 얻기 위해 대기중이며, lock object의 종류가 String임을 알 수 있다. 
<0x33765e38>는 myThread-2의 스택에서도 보이는데, 두 스레드가 이 객체를 lock으로 사용하고 경쟁 관계에 있음을 알 수 있다. myThread-2의 스택을 보면, PrintStream, OutputStreamWrite등도 내부적으로 동기화 되어 있음을 알 수 있다.

Java VisualVM의 경우 "Thread"탭에 "Thread Dump" 버튼을 이용하여 위와 같은 스택 정보를 얻을 수 있다.