锁定老帖子 主题:理解 Java 的 GC 与 幽灵引用
该帖已经被评为精华帖
|
|||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
作者 | 正文 | ||||||||||||||||||||
发表时间:2009-06-04
最后修改:2009-06-07
理解 Java 的 GC 与 幽灵引用 @Test public void strongReference() { Object referent = new Object(); /** * 通过赋值创建 StrongReference */ Object strongReference = referent; assertSame(referent, strongReference); referent = null; System.gc(); /** * StrongReference 在 GC 后不会被回收 */ assertNotNull(strongReference); }
@Test public void weakReference() { Object referent = new Object(); WeakReference<Object> weakRerference = new WeakReference<Object>(referent); assertSame(referent, weakRerference.get()); referent = null; System.gc(); /** * 一旦没有指向 referent 的强引用, weak reference 在 GC 后会被自动回收 */ assertNull(weakRerference.get()); } @Test public void weakHashMap() throws InterruptedException { Map<Object, Object> weakHashMap = new WeakHashMap<Object, Object>(); Object key = new Object(); Object value = new Object(); weakHashMap.put(key, value); assertTrue(weakHashMap.containsValue(value)); key = null; System.gc(); /** * 等待无效 entries 进入 ReferenceQueue 以便下一次调用 getTable 时被清理 */ Thread.sleep(1000); /** * 一旦没有指向 key 的强引用, WeakHashMap 在 GC 后将自动删除相关的 entry */ assertFalse(weakHashMap.containsValue(value)); }
@Test public void softReference() { Object referent = new Object(); SoftReference<Object> softRerference = new SoftReference<Object>(referent); assertNotNull(softRerference.get()); referent = null; System.gc(); /** * soft references 只有在 jvm OutOfMemory 之前才会被回收, 所以它非常适合缓存应用 */ assertNotNull(softRerference.get()); }
@Test public void phantomReferenceAlwaysNull() { Object referent = new Object(); PhantomReference<Object> phantomReference = new PhantomReference<Object>(referent, new ReferenceQueue<Object>()); /** * phantom reference 的 get 方法永远返回 null */ assertNull(phantomReference.get()); }
@Test public void referenceQueue() throws InterruptedException { Object referent = new Object(); ReferenceQueue<Object> referenceQueue = new ReferenceQueue<Object>(); WeakReference<Object> weakReference = new WeakReference<Object>(referent, referenceQueue); assertFalse(weakReference.isEnqueued()); Reference<? extends Object> polled = referenceQueue.poll(); assertNull(polled); referent = null; System.gc(); assertTrue(weakReference.isEnqueued()); Reference<? extends Object> removed = referenceQueue.remove(); assertNotNull(removed); }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
发表时间:2009-06-04
那什么时候使用Finalize什么时候使用ReferenceQueue呢?
|
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
发表时间:2009-06-04
这次对 引用 理解不少, 很受用。
ReferenceQueue 的应用场景,还没有完全理解。 |
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
发表时间:2009-06-04
taowen 写道 那什么时候使用Finalize什么时候使用ReferenceQueue呢?
因为 JVM 不能保证 finalize 何时被调用, 再加上 finalize 内部可以访问对象内部的任何 field 可能导致 GC 过程混乱, 所以推荐使用 WeakReference + ReferenceQueue 来实现资源回收工作, 这里有一篇文章讲得很详细 http://java.sun.com/developer/technicalArticles/javase/finalization/ |
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
发表时间:2009-06-04
如果我用一个ConcurrentHashMap<String, SoftReference>来持有我的Cache。那么我是应该是Finalizer呢还是ReferenceQueue来把SoftReference从cache中清除出去?目的就是把缓存尽可能长的时间持有,除非内存不够了。
|
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
发表时间:2009-06-04
有深度。我喜欢,亲一口。
|
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
发表时间:2009-06-04
说的好精彩 ~~ 以前我用过那么多引用呢~~
还有 就是 java不是不让咱们能操作gc吗 那System.gc();还有作用吗~ |
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
发表时间:2009-06-04
whaosoft 写道 说的好精彩 ~~ 以前我用过那么多引用呢~~
还有 就是 java不是不让咱们能操作gc吗 那System.gc();还有作用吗~ System.gc()是建议调用gc 不保证调用时间 作用还是有的... |
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
发表时间:2009-06-04
最后修改:2009-06-04
taowen 写道 如果我用一个ConcurrentHashMap<String, SoftReference>来持有我的Cache。那么我是应该是Finalizer呢还是ReferenceQueue来把SoftReference从cache中清除出去?目的就是把缓存尽可能长的时间持有,除非内存不够了。
应该是这样 如果你Sofrreference里面引用的对象没有别的引用的时候 在每次内存溢出前就会被自动清理掉 |
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
发表时间:2009-06-04
使用 PhantomReference 就可以避免这个问题, 因为 PhantomReference 是在 finalize 方法执行后回收的,也就意味着此时已经不可能拿到原来的引用, 也就不会出现上述问题。
这句话说的有问题吧,不理解、 |
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||