Tôi đang cố gắng hiểu thêm về java, đặc biệt là về quản lý bộ nhớ và chủ đề. Vì lý do này, gần đây tôi đã tìm thấy sự quan tâm đến việc xem xét các bãi chứa chuỗi.Làm cách nào để phân tích kết xuất chuỗi java?
Dưới đây là vài dòng trích từ một ứng dụng web sử dụng VisualVM, được xây dựng trong công cụ 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)
Trước tiên tôi có thắc mắc về một số tên biến:
- những gì hiện tid và nid có nghĩa là gì?
- Hình trong ngoặc đơn vuông sau Object.wait là gì?
Sau đó cho chồng theo dõi bản thân:
- có nghĩa gì chờ đợi vào < .....> (a java.lang ....) và số lượng là những gì trong < ..>
- có nghĩa gì khóa < .....> (a java.lang ....) cùng một câu hỏi, những gì trong < ..>
Tôi nghĩ từ khóa bị khóa liên quan đến điều kiện chờ đợi, tuy nhiên, tôi đã sai. Trong thực tế, tôi tự hỏi tại sao khóa được lặp lại ba lần, nhưng các chủ đề ở trạng thái Runnable như đã thấy trong cùng một bãi:
"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)
Rồi cuối cùng của tất cả, đâ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 runnable, 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 chuỗi?
Nếu bạn có thể trả lời cho tất cả các câu hỏi của tôi, tôi sẽ rất biết ơn.
Cảm ơn