java - 了解引用处理程序线程

标签 java reference thread-dump

我将继续深入了解 Java 线程。不幸的是,我的 Java 认证没有涵盖这部分,所以学习的唯一方法是发布一系列愚蠢的问题。经过这么多年的 Java 开发,我有时想知道我还需要学习多少 :-)

我现在特别注意引用处理程序线程。

"Reference Handler" daemon prio=10 tid=0x02da3400 nid=0xb98 in Object.wait() [0x0302f000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x1aac0320> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:485)
    at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
    - locked <0x1aac0320> (a java.lang.ref.Reference$Lock)

下面是一些问题,其中一些我知道答案,但我没有发布它,因为我想听听其他人的意见:

  1. Reference Handler 线程应该做什么?
  2. 线程转储应该被认为是自下而上,为什么堆栈跟踪以locked开头,lock语句不应该至少在线程运行后出现?
  3. “ native 方法”是什么意思?
  4. 为什么是“Unknown Source”,在这种情况下线程转储无法调用源代码?
  5. 最后waiting on和locked是一样的,为什么?

像往常一样,我恳请回答所有问题,以便我标记为已回答。

最佳答案

  1. 怀疑它会为 JVM 处理正在运行的终结器。这是一个实现细节,因此未在 JVM 规范中指定。
  2. 这只意味着 java.lang.ref.Reference$Lock 被锁定在 preceding 行中提到的方法中(即在 ReferenceHandler.运行()
  3. “ native 方法”仅表示该方法是在 native (即非 Java)代码中实现的(想想 JNI)。
  4. Unknown Source 仅表示 .class 文件不包含任何源代码位置信息(至少对于这一特定点而言)。这可能发生在方法是合成方法(这里看起来不像),或者类是在没有调试信息的情况下编译的。
  5. 当线程在某个对象上等待时,它必须在调用跟踪的某个时间点锁定了该对象,所以你不能 em> 确实有一个 waiting on 没有对应的 locked

关于java - 了解引用处理程序线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7658670/

相关文章:

algorithm - Cauchy Reed-Solomon 算法如何工作?

java - 无法将文本从另一个类追加到 JTextArea

java - IBM WAS 5.1/Tread 转储分析 : Servlet. Engine.Transports 卡在 java.net.SocketInputStream.socketRead0 上

java - 在 DJigger 中搜索主机名没有找到任何内容

java - %n 和\n 在 Java 中打印新行的区别

java - readAllBytes()。文件系统异常 : The process cannot access the file because it is being used by another process

java - 重写 tostring() 方法并传递对象引用而不获取哈希值

java - 如何创建 Java Web Start 应用程序的线程转储

java - 需要求基本运算集并集/交集/对称差JAVA

java - 在 Java 中显示数字的前 n 位