了解Reference Handler线程

时间:2011-10-05 08:39:09

标签: 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)

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

  1. 参考处理程序线程应该做什么?
  2. 线程转储应该被认为是自下而上的,为什么堆栈跟踪以锁定开始,至少在线程运行后是否应该出现锁定语句?
  3. “原生方法”是什么意思?
  4. 为什么“Unknown Source”,在这种情况下,线程转储无法调用源代码?
  5. 最后等待和锁定有相同的,为什么?
  6. 像往常一样,我请求回答所有问题,以便我能够回答。

3 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:4)

1)Finalizer Thread调用终结器方法。 参考线程有类似的目的。

http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/lang/java/lang/ref/Reference.java.htm

OpenJDK源声明它是

  

将待处理引用排入队列的高优先级线程

GC创建一个简单的链接引用列表,需要进行处理,并且该线程会快速将它们添加到正确的队列中。这是在两个阶段完成的原因是GC除了找到引用之外什么都不做,该线程调用处理这些引用的代码,例如致电Cleaners,并通知ReferenceQueue听众。

2)在进入同步方法之前获取锁定。

<〜> 3-5)Joachim所涵盖;)

答案 2 :(得分:2)

哇,对我来说太深了。我只能回答你的一两个问题。

“本机方法”仅意味着该方法的实现在某些本机(即C或C ++)库中。一旦调用堆栈“原生”,JVM就无法再对其进行监控。没办法提供额外的堆栈信息。

“未知来源”可能意味着代码是在打开优化并关闭调试信息的情况下编译的(-g标志?)。这消除了.class文件中的文件/行信息。