[讨论] 请教Weak Reference及其在HotSpot GC中的行为

LeafInWind 2014-01-15
一直对weak reference似懂非懂,看GC代码时也特意跳过,请问R神能否指点一下
RednaxelaFX 2014-01-16
对weak reference的语义不熟悉的话先看Bob Lee的一个经典幻灯片:The Ghost in the Virtual Machine: A Reference to References

然后关于HotSpot里的实现相关的一些介绍,请先看看这里:http://hllvm.group.iteye.com/group/topic/27945?page=2#post-209812
LeafInWind 2014-01-16
谢谢R神
LeafInWind 2014-01-22
看了hotspot在DefNewGeneration::collect中对weak reference的处理,基本能明白了。但有一个问题:rp->process_discovered_references(...)中一开始就直接处理SoftRef链、WeakRef链等了,但这些链是什么时候建立的呢?
RednaxelaFX 2014-01-22
LeafInWind 写道
看了hotspot在DefNewGeneration::collect中对weak reference的处理,基本能明白了。但有一个问题:rp->process_discovered_references(...)中一开始就直接处理SoftRef链、WeakRef链等了,但这些链是什么时候建立的呢?

哈哈哈,太隐秘了么。
所有普通Java对象的类型信息都是用instanceKlass记录的,唯有弱引用类型例外(soft、weak、phantom、final都算在内),用的是特殊的instanceRefKlass。
(在JDK7开始java.lang.Class也有特殊的klass了不过我们先忽略它⋯这里不重要)

这个特殊版的klass在oop_iterate的时候会做特别的事情。详见InstanceRefKlass::oop_follow_contents()的实现。留意到它会调用ReferenceProcessor::discover_reference()。这样就“发现”了弱引用。所有被“发现”的弱引用都会被添加到响应弱引用类型的待处理列表上。

等到整个GC堆里活对象都遍历过之后,ReferenceProcessor就会“处理”弱引用,逐个遍历过去看看该弱引用的referent是否还活着。
LeafInWind 2014-01-22
OK 谢谢R神
Global site tag (gtag.js) - Google Analytics