持有引用java.lang.ref 和 WeakHashMap
Thinking in java P554
?
?
持有引用
如果想继续持有对某个对象的引用,希望以后能够反问到该对象,
但是也希望能够允许垃圾回收器是否它,这是就应该使用Reference
对象。这样,可以继续使用改对象,而再内存消耗完时允许是否它。
?
以Reference对象作为你和普通引用的媒介,另外,一定不能有
普通的引用指向那个兑现g.zheyang就能达到上述目的。
(普通的引用指没有经Reference对象包装过的引用)。
如果垃圾回收器发现某个兑现沟通过普通引用是可获得的,该
对象就不会被释放。
?
SoftReference, WeakReference 和 PhantomReference由强到若,
对应不同级别的"可获得性".Softreference用以是想内存
敏感的高速缓存。Weak reference是为实现个"规范映射"
而设计的,它部妨碍垃圾回收器回收映射的键或值。
规范映射中对象的实力可以在程序的多处被同时使用,
以节省存储空间。Phantomreference用以调度回收前
的清理工作,比Java终止机制更灵活。
?
?
?
结果:
zing Key 209
Finalizing Key 208
Finalizing Key 206
Finalizing Key 205
Finalizing Key 203
Finalizing Key 202
Finalizing Key 200
Finalizing Key 199
Finalizing Key 197
Finalizing Key 196
Finalizing Key 194
Finalizing Key 193
Finalizing Key 191
Finalizing Key 190
Finalizing Key 188
...
可以看到垃圾回收期每隔三个键就跳过一个,因为指向那个键的普通引用被存如了Keys数组,
所以偶那些对象不能被垃圾回收器回收。