25

我将继续深入了解 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. Reference Handler 线程应该做什么?
  2. 线程转储应该被认为是自下而上的,为什么堆栈跟踪以锁定开始,至少在线程运行后不​​应该出现锁定语句?
  3. “本机方法”是什么意思?
  4. 为什么是“未知来源”,在这种情况下线程转储无法调用源代码?
  5. 最后waiting on和locked是一样的,为什么?

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

4

3 回答 3

14
  1. 怀疑它会处理 JVM 的运行终结器。这是一个实现细节,因此在 JVM 规范中没有指定。
  2. 这仅意味着被锁定在它前面java.lang.ref.Reference$Lock的行中提到的方法中(即在.ReferenceHandler.run()
  3. “本机方法”仅仅意味着该方法是在本机(即非Java)代码中实现的(想想JNI)。
  4. Unknown Source 仅表示该.class文件不包含任何源代码位置信息(至少对于此特定点而言)。这可能发生方法是合成方法(这里看起来不像),或者类是在没有调试信息的情况下编译的。
  5. 当一个线程等待某个对象时,它一定在调用跟踪的某个时刻锁定了该对象,所以如果没有相应waiting onlocked.
于 2011-10-05T08:47:37.330 回答
4

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

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

OpenJDK 源声明它是一个

将挂起的引用排入队列的高优先级线程

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

2) 一个同步的方法在进入之前获得一个锁。

3-5) 由 Joachim 报道;)

于 2011-10-05T10:29:32.527 回答
2

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

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

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

于 2011-10-05T08:46:14.960 回答