2017-06-22 64 views
0

我看着java.lang.ref.Reference,并已发现在JDK 1.8_131一个有趣的(至少对我来说)线治疗?现场`referent`专门由GC

GC如何特别对待它?

这是否是一个事实,任何具有此名称的变量将以相同的方式处理?

我在Java规范中搜索了referent,但没有找到任何东西。

谢谢。

回答

2

此评论只是说明,可以从documentation of the package和各个类派生出什么。特殊处理仅适用于java.lang.ref.Reference .referent这个特定的JRE中的字段,作为实现细节。一般来说,如果你想了解语义,你应该首先查看文档,之前(如果有的话)查看源代码。

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

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

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"); 

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

+0

冷静,我的grep没有找到这个。顺便说一句,看起来像这个测试只是看起来该字段提交,所以这不是一个GC行为/耸耸肩 –

+0

@ OlegKovalov忘了提及...源代码中有许多其他参考提及'G1' – Eugene