了解Reference Handler线程

Leo*_*rdo 23 java reference thread-dump

我正在继续深入理解Java Thread.不幸的是,我的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)
Run Code Online (Sandbox Code Playgroud)

现在有一些问题,其中一些我知道答案,但我不发布,因为我想听听别人的意见:

  1. 参考处理程序线程应该做什么?
  2. 线程转储应该被认为是自下而上的,为什么堆栈跟踪以锁定开始,至少在线程运行之后是否应该出现锁定语句?
  3. "原生方法"是什么意思?
  4. 为什么"Unknown Source",在这种情况下,线程转储无法调用源代码?
  5. 最后等待和锁定有相同的,为什么?

像往常一样,我请求回答所有问题,以便我能够回答.

Joa*_*uer 13

  1. 怀疑它处理JVM的运行终结器.这是一个实现细节,因此未在JVM规范中指定.
  2. 这仅意味着该java.lang.ref.Reference$Lock被锁定在行中提到的方法在它(即ReferenceHandler.run().
  3. "本机方法"仅意味着该方法是在本机(即非Java)代码中实现的(想想JNI).
  4. Unknown Source仅表示该.class文件不包含任何源代码位置信息(至少对于此特定点).发生这种情况无论是当该方法是合成的(不像在这里),或者类没有调试信息被编译.
  5. 当一个线程在某个对象上等待时,它必须在调用跟踪的某个点上锁定该对象,所以如果没有相应的话,你就无法拥有它.waiting onlocked