Java hakkında, özellikle bellek yönetimi ve iş parçacıkları hakkında daha fazla şey anlamaya çalışıyorum. Bu nedenle, son zamanlarda iş parçacığı dökümlerine bakmaya ilgi duydum.
Java için yerleşik bir araç olan VisualVM kullanılarak bir web uygulamasından alınan birkaç satır:
"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)
Öncelikle bazı değişken isimleriyle ilgili sorularım var:
- tid ve nid ne anlama geliyor?
- Object.wait'den sonraki kare parantez içindeki rakam nedir?
Ardından yığın izinin kendisi için:
- <.....> 'da (java.lang ....) beklemek ne anlama geliyor ve <..> içindeki numara kaç
- kilitli ne demek <.....> (java.lang ....) aynı soru, <..> içinde ne var
Kilitli kelimesinin bir şekilde bekleme durumuyla ilişkili olduğunu düşündüm, ancak yanılmışım. Aslında, kilitlemenin neden üç kez tekrarlandığını merak ediyorum, ancak iş parçacığı aynı dökümde görüldüğü gibi çalıştırılabilir durumda:
"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)
Son olarak, bu onların en kötüsüydü:
"CompilerThread0" daemon prio=10 tid=0x02b81000 nid=0x698 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
Bu iş parçacığı çalıştırılabilir durumda, ancak koşulda bekliyor. 0x00000 koşulu ve nedir?
Yığın izleme, iş parçacığı sınıfının herhangi bir kanıtı olmadan neden bu kadar kısa?
Tüm sorularıma cevap verirseniz çok minnettar olurum.
Teşekkürler