`

Weak Reference

阅读更多
最近看下Guice源码,
 
public void init(FilterConfig filterConfig) throws ServletException {
    final ServletContext servletContext = filterConfig.getServletContext();

    // Store servlet context in a weakreference, for injection
    GuiceFilter.servletContext = new WeakReference<ServletContext>(servletContext);

    // In the default pipeline, this is a noop. However, if replaced
    // by a managed pipeline, a lazy init will be triggered the first time
    // dispatch occurs.
    GuiceFilter.pipeline.initPipeline(servletContext);
  }

中有WeakReference,经google,记录下:
Weak Reference 是什么?其实是跟垃圾收集相关的东西。
有 Weak Reference 当然也有 Strong Reference。其实我们常用的引用就是 strong reference,比如下面代码就会创建一个 strong reference。

Object foo = new Object();
执行上面代码的时候将创建一个对象,变量 foo 中存放了这个对象的 Strong Reference,利用它可以访问到该对象。

记住一点,只要有 Strong Reference 指向对象,这个对象就不会被垃圾收集器回收。Weak Reference 同样用来引用对象,但是 Weak Reference 指向的对象是可能被回收的,比如当没有 Strong Reference 指向它的时候。

那么什么时候可能用到 Weak Reference?看看下面几个场景。

你想给对象附加一些信息,于是你用一个 Hashtable 把对象和附加信息关联起来。你不停的把对象和附加信息放入 Hashtable 中,但是当对象用完的时候,你不得不把对象再从 Hashtable 中移除,否则它占用的内存变不会释放。万一你忘记了,那么没有从 Hashtable 中移除的对象也可以算作是内存泄漏。理想的状况应该是当对象用完时,Hashtable 中的对象会自动被垃圾收集器回收,不然你就是在做垃圾回收的工作了。
你想实现一个图片缓存,因为加载图片的开销比较大。你将图片对象的引用放入这个缓存,以便以后能够重新使用这个对象。但是你必须决定缓存中的哪些图片不再需要了,从而将引用从缓存中移除。不管你使用什么管理缓存的算法,你实际上都在处理垃圾收集的工作,更简单的办法(除非你有特殊的需求,这也应该是最好的办法)是让垃圾收集器来处理,由它来决定回收哪个对象。
Weak Reference 这时候就能派上用场了。把对象的 weak reference 放入 Hashtable 或者缓存中,当没有 strong reference 指向他们的时候,对象就可以被垃圾收集器回收了。实际上,有一个 WeakHashMap 就是专门做这个事的。

那么怎样创建对象的 weak reference 呢?很简单,Java 标准库中有个类 WeakReference,

WeakReference weakref = new WeakReference(ref);
这样 weakref 就是 ref 指向对象的一个 weak reference。要引用这个 weak reference 指向的对象可以用 get 方法。

Object ref = weakref.get();
注意,get 可能返回 null,这时原先指向的对象就不可用了,它可能已经被回收了。

分享到:
评论
2 楼 yulincqupt 2012-09-12  
看到没,在so = null;后,它的弱引用依然是可用的。所以对于大对象的使用,aicken建议使用此种方式。另外,弱引用有长短之分:长弱引用在对象终结后,依然追踪对象;短弱引用则反之,aicken不建议人为干预GC的工作成果,所以推荐使用短弱引用,即上面代码中的方式。

举个事例:
1 楼 yulincqupt 2012-09-12  
# public class SomeObject  
# { 

# } 
# public static void Main()  
# { 
#  SomeObject so = new SomeObject(); 
#  WeakReference WRso = new WeakReference(so); 
#  so = null; 
#  Console.WriteLine(WRso.IsAlive); // True 
#  // 调用GC 手动回收。 
#  GC.Collect(); 
#  Console.WriteLine(WRso.IsAlive); // False 
# }

相关推荐

    Python Weak Reference Ext.-开源

    Python中的弱引用(Weak Reference)是一种特殊的数据结构,它允许程序员创建对对象的引用,但不增加对象的引用计数。这种机制在处理大型数据结构或者循环引用问题时尤其有用,因为它可以避免内存泄漏。在Python标准库...

    Java功底之Reference

    2. **弱引用(Weak Reference)**:弱引用比软引用更弱,一旦发现一个对象只有弱引用,无论内存是否充足,垃圾收集器都会在下次GC时回收该对象。这使得弱引用非常适合用于构建不阻塞垃圾收集的关联数据结构。 3. **...

    理解Java中的弱引用(Weak Reference)

    本篇文章尝试从What、Why、How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义、基本使用场景和使用方法。由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指出,谢谢大家:) ...

    Java学习之Reference、Eclipse调优、jvisualvm使用

    通常,Java有四种类型的引用:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。强引用是最常见的类型,当对象被强引用持有时,垃圾回收器不会回收...

    Objective C Pocket Reference.rar

    - **弱引用(Weak Reference)**:防止循环引用,避免内存泄漏。 - **强引用(Strong Reference)**:默认的引用类型,持有对象直到引用计数为零。 4. **Foundation框架** - **NSObject**:所有Objective-C对象...

    java面试经典100题

    Java 5引入了四种不同的引用类型,它们分别是强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。每种引用类型在内存管理和垃圾回收上有不同的特点: ...

    Java中的强软弱虚引用

    为了更好地理解和控制对象的生命周期,Java提供了四种不同类型的引用:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)以及虚引用(Phantom Reference)。每种引用都有其特定的...

    iOS 5 ARC完全指南

    ARC中还有“弱引用”(weak reference)的概念,弱引用不会增加对象的引用计数,因此不会阻止对象被释放。弱引用主要用于避免循环引用,比如在代理模式中,避免代理与被代理对象之间互相持有导致的内存泄漏。当一个...

    自动引用计数.playground.zip

    2. 弱引用(Weak Reference):弱引用不会增加对象的引用计数,且不阻止对象的销毁。当对象的强引用计数归零时,即使还有弱引用存在,对象也会被销毁。 3. 无主引用(Unowned Reference):无主引用类似于弱引用,但...

    Java引用类型编程开发技术共13页.pdf.zip

    7. 弱引用(Weak Reference):弱引用对象的存在不会阻止垃圾收集器的回收。一旦没有任何强引用或软引用指向对象,即使是弱引用,该对象也会被立即回收。 8. 虚引用(Phantom Reference):虚引用并不直接与对象相...

    Java中弱引用软引用虚引用及强引用的区别Java开发Ja

    3. **弱引用(Weak Reference)**: - 弱引用比软引用更弱,只要垃圾收集器运行,无论内存是否充足,都会回收弱引用指向的对象。弱引用常用于实现内存敏感的缓存。 - 示例:`WeakReference&lt;String&gt; weakRef = new ...

    Java中的软引用弱引用和虚引用.docx

    本文将深入探讨Java中三种特殊的引用类型——软引用(Soft Reference)、弱引用(Weak Reference)以及虚引用(Phantom Reference),并分析它们如何帮助我们更好地管理内存资源。 #### 二、基础知识回顾 在深入了解这三...

    ThreadLocal,你真的了解吗?

    3. 弱引用(Weak Reference): - 弱引用对象会在垃圾回收器扫描时立即回收,无论内存是否充足。 - 示例:`WeakReference sr = new WeakReference(new String("hello"));` - ThreadLocal 内部使用弱引用来管理...

    FindBugs规则整理_中文版.pdf

    1. LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE: Potential lost logger changes due to weak reference in OpenJDK。FindBugs发现OpenJDK中的一个潜在的不兼容问题,即logger配置改变时可能会丢失。解决方法是使用强引用...

    JVM 38 道面试题及答案.docx

    * 弱引用(Weak Reference):对象相比较软引用,要更加无用一些,它拥有更短的生命周期。 * 虚引用(Phantom Reference):一种形同虚设的引用,在现实场景中用的不是很多,它主要用来跟踪对象被垃圾回收的活动。 ...

    各个大厂--iOS开发精品面试题 题集大全.zip

    内存管理是iOS开发中的重要部分,面试官可能会询问ARC(Automatic Reference Counting)的工作原理、强引用循环(Strong Reference Cycle)及其解决方法,以及弱引用(Weak Reference)和无主引用(Unowned ...

    java面试宝典

    Java 从 JDK 1.5 开始引入了四种不同级别的引用,它们分别是强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。强引用是最常见的引用,只要对象还有...

Global site tag (gtag.js) - Google Analytics