Java GC专门处理的字段“referent”

Java GC专门处理的字段“referent”,java,garbage-collection,Java,Garbage Collection,我正在查看java.lang.ref.Reference,在JDK1.8_131中发现了一行有趣的代码(至少对我来说是这样): private T referent;/*由GC特别处理*/ 这是什么意思 GC如何特别对待它 任何具有此名称的变量都将以相同的方式处理,这是事实吗 我在Java规范中搜索了referent,但什么也没找到 谢谢。此评论仅说明可以从和单个类派生什么。作为实现细节,特殊处理仅适用于此特定JRE中的java.lang.ref.Reference.referent字段。通常,

我正在查看
java.lang.ref.Reference
,在JDK1.8_131中发现了一行有趣的代码(至少对我来说是这样):

private T referent;/*由GC特别处理*/

这是什么意思

GC如何特别对待它

任何具有此名称的变量都将以相同的方式处理,这是事实吗

我在Java规范中搜索了
referent
,但什么也没找到


谢谢。

此评论仅说明可以从和单个类派生什么。作为实现细节,特殊处理仅适用于此特定JRE中的
java.lang.ref.Reference.referent
字段。通常,如果您想理解语义,应该先看文档,然后再(如果有的话)看源代码

因为这是一个实现细节,所以在规范中找不到它。规范只告诉您和的语义。对于Java应用程序开发人员来说,这个字段的存在是不相关的,因为他们只会通过创建这三个类的实例来间接使用它,这些类的文档指定了语义


对于JVM实现,只知道特殊的
referent
字段是不够的,因为它是由所有这些引用类继承的,实际的处理取决于垃圾收集器正在查看的引用实例的实际类型。这个行为已经硬编码到JVM中,用于处理类库的这个特定实现。

是的,Holger是对的;但是如果你和我一样,我有点喜欢这些细节,就像你一样。因此,我喜欢查看源代码,并在热点源代码中执行一些
grep
。我发现了一个名为:
ReferenceGetLoopTest
的测试,它有:

 if (field.getName().equals("referent") 
       && field.getDeclaringClass().equals(getMetaAccess().lookupJavaType(Reference.class)))
这是第一个迹象,表明这一领域确实得到了不同的对待。但这是在graalvm中,所以这里还有另一个指示,表明此字段在以下方面有所不同:
hotspot/src/cpu/x86/vm/templateTranslatorGenerator_x86.cpp

   const int referent_offset = java_lang_ref_Reference::referent_offset;
   guarantee(referent_offset > 0, "referent offset not initialized");

还有很多其他的地方。。。所以,是的,你的结论是正确的

酷,我的grep没有发现这个。顺便说一句,这个测试看起来只是显示了字段,所以这不是GC行为/shrug@OlegKovalov忘了提。。。源代码中还有许多其他参考文献提到了这一点