[讨论] 请教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神
|