Saya mencoba memahami lebih banyak tentang java, terutama tentang manajemen memori dan utas. Untuk alasan ini saya baru-baru ini menemukan minat untuk melihat pembuangan benang.
Berikut adalah beberapa baris yang diambil dari aplikasi web menggunakan VisualVM, alat bawaan untuk 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)
Pertama saya punya pertanyaan tentang beberapa nama variabel:
- apa artinya tid dan nid?
- Berapa angka dalam tanda kurung setelah Object.wait?
Kemudian untuk pelacakan tumpukan itu sendiri:
- apa artinya menunggu <.....> (a java.lang ....) dan berapa angka di <..>
- apa artinya terkunci <.....> (a java.lang ....) pertanyaan yang sama, ada apa di <..>
Saya pikir kata terkunci bagaimanapun juga terkait dengan kondisi menunggu, namun, saya salah. Sebenarnya, saya bertanya-tanya mengapa terkunci diulang tiga kali, tetapi utas dalam keadaan dapat dijalankan seperti yang terlihat di dump yang sama:
"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)
Kemudian yang terakhir dari semuanya, ini yang terburuk dari mereka:
"CompilerThread0" daemon prio=10 tid=0x02b81000 nid=0x698 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
Utas ini dalam keadaan dapat dijalankan, tetapi menunggu dengan syarat. Kondisi apa dan apa itu 0x00000?
Mengapa pelacakan tumpukan sangat pendek tanpa bukti kelas utas?
Jika Anda bisa menjawab semua pertanyaan saya, saya akan sangat berterima kasih.
Terima kasih
sumber