字段`referent`由GC特别处理

时间:2017-06-22 10:05:34

标签: java garbage-collection

我正在查看java.lang.ref.Reference,并在JDK 1.8_131中找到了一个有趣的(至少对我而言)行:

private T referent; /* Treated specially by GC */

这是什么意思?

GC如何特别对待它?

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

我在Java规范中搜索过referent但没有找到任何内容。

谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

是的,Holger是对的;但如果你像我一样 - 我有点喜欢这个细节,就像你一样。所以我喜欢查看源代码并在热点源中做一点grep。我发现了一个名为ReferenceGetLoopTest的测试:

 if (field.getName().equals("referent") 
       && field.getDeclaringClass().equals(getMetaAccess().lookupJavaType(Reference.class)))

这是第一个表明确实以不同的方式对待这个领域的迹象。但那是在graalvm,所以这是另一个迹象表明这个领域不同:hotspot/src/cpu/x86/vm/templateInterpreterGenerator_x86.cpp

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

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