ฉันพยายามทำความเข้าใจเพิ่มเติมเกี่ยวกับ java โดยเฉพาะเกี่ยวกับการจัดการหน่วยความจำและเธรด ด้วยเหตุนี้ฉันเพิ่งพบความสนใจในการดูที่ทิ้งเธรด
นี่คือไม่กี่บรรทัดที่นำมาจากเว็บแอปโดยใช้ VisualVM ซึ่งเป็นเครื่องมือในตัวสำหรับ java:
"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 .... ) หมายถึงอะไรและตัวเลขใน<.. > คืออะไร
- มันหมายความว่าอะไรล็อค <..... > (a java.lang .... )คำถามเดียวกันมีอะไรอยู่ใน<.. >
ฉันคิดว่าคำว่าล็อคเกี่ยวข้องกับเงื่อนไขการรอสักครั้ง แต่ฉันคิดผิด อันที่จริงฉันสงสัยว่าทำไมล็อกซ้ำสามครั้ง แต่เธรดอยู่ในสถานะรันได้ดังที่เห็นในดัมพ์เดียวกัน:
"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 คืออะไร?
เหตุใดการติดตามสแต็กจึงสั้นโดยไม่มีหลักฐานเกี่ยวกับคลาสเธรด
หากคุณสามารถตอบคำถามทั้งหมดของฉันได้ฉันจะขอบคุณมาก
ขอบคุณ