我正在查看java.lang.ref.Reference
,并在JDK 1.8_131中找到了一个有趣的(至少对我而言)行:
private T referent; /* Treated specially by GC */
这是什么意思?
GC如何特别对待它?
具有此名称的任何变量都将以相同的方式处理,这是真的吗?
我在Java规范中搜索过referent
但没有找到任何内容。
谢谢。
答案 0 :(得分:2)
此评论仅说明可以从documentation of the package和各个类派生的内容。特殊处理仅适用于此特定JRE中java.lang.ref.Reference .referent
的字段,作为实现细节。通常,如果您想了解语义,您应该先查看文档,然后(如果有的话)查看源代码。
由于这是一个实现细节,因此您不会在规范中找到它。该规范仅告诉您SoftReference
,WeakReference
和PhantomReference
的语义。对于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");
还有很多其他地方......所以,是的,你的结论是正确的