저는 자바, 특히 메모리 관리와 스레드에 대해 더 많이 이해하려고합니다. 이런 이유로 최근에 스레드 덤프에 관심이 있습니다.
다음은 Java 용 기본 제공 도구 인 VisualVM을 사용하는 웹 앱에서 가져온 몇 줄입니다.
"Finalizer" daemon prio=8 tid=0x02b3d000 nid=0x898 in Object.wait() [0x02d0f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x27ef0288> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
- locked <0x27ef0288> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
Locked ownable synchronizers:
- None
"Reference Handler" daemon prio=10 tid=0x02b3b800 nid=0x494 in Object.wait() [0x02cbf000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x27ef0310> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:485)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
- locked <0x27ef0310> (a java.lang.ref.Reference$Lock)
먼저 몇 가지 변수 이름에 대한 질문이 있습니다.
- tid and nid은 무슨 뜻인가요?
- Object.wait 다음에 제곱 괄호 안의 숫자는 무엇입니까?
그런 다음 스택 추적 자체의 경우 :
- <.....> (java.lang ....)을 기다리는 것은 무엇을 의미 하며 <..> 의 숫자는 무엇입니까?
- 잠긴 <.....> (java.lang ....) 같은 질문, <..>에 있는 것은 무엇을 의미합니까?
잠긴 단어가 왠지 대기 조건과 관련이 있다고 생각했지만 틀 렸습니다. 실제로 locked가 세 번 반복되는 이유가 궁금하지만 스레드는 동일한 덤프에서 볼 수 있듯이 실행 가능한 상태입니다.
"Thread-0" prio=6 tid=0x02ee3800 nid=0xc1c runnable [0x03eaf000]
java.lang.Thread.State: RUNNABLE
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:199)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:256)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
- locked <0x23963378> (a java.io.BufferedInputStream)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
- locked <0x23968450> (a java.io.InputStreamReader)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
- locked <0x23968450> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at org.codehaus.plexus.util.cli.StreamPumper.run(StreamPumper.java:145)
마지막으로, 이것은 그들 중 최악이었습니다.
"CompilerThread0" daemon prio=10 tid=0x02b81000 nid=0x698 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
이 스레드는 실행 가능한 상태이지만 조건에 따라 대기 중입니다. 어떤 조건과 0x00000은 무엇입니까?
스레드 클래스의 증거없이 스택 추적이 너무 짧은 이유는 무엇입니까?
제 모든 질문에 답해 주시면 매우 감사하겠습니다.
감사