我看着java.lang.ref.Reference
,并已发现在JDK 1.8_131一个有趣的(至少对我来说)线治疗?现场`referent`专门由GC
GC如何特别对待它?
这是否是一个事实,任何具有此名称的变量将以相同的方式处理?
我在Java规范中搜索了referent
,但没有找到任何东西。
谢谢。
我看着java.lang.ref.Reference
,并已发现在JDK 1.8_131一个有趣的(至少对我来说)线治疗?现场`referent`专门由GC
GC如何特别对待它?
这是否是一个事实,任何具有此名称的变量将以相同的方式处理?
我在Java规范中搜索了referent
,但没有找到任何东西。
谢谢。
此评论只是说明,可以从documentation of the package和各个类派生出什么。特殊处理仅适用于java.lang.ref.Reference .referent
这个特定的JRE中的字段,作为实现细节。一般来说,如果你想了解语义,你应该首先查看文档,之前(如果有的话)查看源代码。
由于这是一个实现细节,您不会在规范中找到它。该规范仅告诉您SoftReference
,WeakReference
和PhantomReference
的语义。对于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/templateInterpreterGenerator_x86.cpp
:
const int referent_offset = java_lang_ref_Reference::referent_offset;
guarantee(referent_offset > 0, "referent offset not initialized");
还有很多其他的地方太...所以,是的,你的结论是正确的
冷静,我的grep没有找到这个。顺便说一句,看起来像这个测试只是看起来该字段提交,所以这不是一个GC行为/耸耸肩 –
@ OlegKovalov忘了提及...源代码中有许多其他参考提及'G1' – Eugene