Tôi đang cố gắng hiểu thêm về java, đặc biệt là về quản lý bộ nhớ và luồng. Vì lý do này, tôi gần đây đã tìm thấy hứng thú khi xem xét các bãi chứa chỉ.
Dưới đây là một vài dòng được lấy từ một ứng dụng web bằng VisualVM, một công cụ tích hợp sẵn cho 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)
Đầu tiên, tôi có câu hỏi về một số tên biến:
- tid và nid nghĩa là gì?
- Hình trong ngoặc vuông sau Object.wait là gì?
Sau đó, đối với bản thân dấu vết ngăn xếp:
- nó có nghĩa là gì khi đợi trên <.....> (java.lang ....) và số trong <..>
- Nó có nghĩa là gì bị khóa <.....> (một java.lang ....) cùng một câu hỏi, có gì trong <..>
Tôi nghĩ rằng từ khóa theo cách nào đó có liên quan đến điều kiện chờ, tuy nhiên, tôi đã nhầm. Trên thực tế, tôi tự hỏi tại sao bị khóa lặp lại ba lần, nhưng luồng ở trạng thái có thể chạy được như được thấy trong cùng một kết xuất:
"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)
Cuối cùng, đây là điều tồi tệ nhất trong số họ:
"CompilerThread0" daemon prio=10 tid=0x02b81000 nid=0x698 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
Chủ đề này ở trạng thái chạy được, nhưng nó đang chờ trong điều kiện. Điều kiện gì và 0x00000 là gì?
Tại sao dấu vết ngăn xếp quá ngắn mà không có bất kỳ bằng chứng nào về lớp luồng?
Nếu bạn có thể trả lời tất cả các câu hỏi của tôi, tôi sẽ rất biết ơn.
Cảm ơn