转载自:http://www.cnblogs.com/bayonetxxx/archive/2009/06/02/1494728.html

我们平常用的都是对象的强引用,如果有强引用存在,GC是不会回收对象的。我们能不能同时保持对对象的引用,而又可以让GC需要的时候回收这个对象呢?.NET中提供了WeakReference来实现。弱引用可以让您保持对对象的引用,同时允许GC在必要时释放对象,回收内存。对于那些创建便宜但耗费大量内存的对象,即希望保持该对象,又要在应用程序需要时使用,同时希望GC必要时回收时,可以考虑使用弱引用。弱引用使用起来很简单,看下面的代码:

Object obj = new Object();
WeakReference wref = new WeakReference( obj );
obj = null;

第一行代码新建了一个新的对象,这里叫它对象A,obj是对对象A的强引用。接着第二行代码新建了一个弱引用对象,参数就是对象A的强引用,第三行代码释放掉对对象A的强引用。这时如果GC进行回收,对象A就会被回收。
怎样在取得对象A的强引用呢?很简单,请看代码2:

Object obj2 = wref.Target;
if( obj2 != null )
{
   // 做你想做的事吧。
}
else
{
// 对象已经被回收,如果要用必须新建一个。
}

只要显示的将弱引用的Target属性附值就会得到弱引用所代表对象的一个强引用。不过在使用对象之前要对其可用性进行检查,因为它可能已经被回收了。如 果你得到的是null(VB.NET下为Nothing),表明对象已经被回收,不能再用了,需要重新分配一个。如果不是null,就可以放心大胆的用 了。
接下来让我们看WeakReference的另外一个版本,请看代码3:
// public WeakReference(
//   object target,
//   bool trackResurrection
//);

Object obj1 = new Object();

Object obj2 = new Object();

WeakReference wref1 = new WeakReference( obj1, false );

WeakReference wref2 = new WeakReference( obj2, true );

WeakReference的另外一个版本有两个参数,第一个参数和我们前面用的版本的一样。第二个参数让我们看一下他的原型,bool trackResurrection,跟踪复活,是个bool型,就是是否跟踪复活。前面的文章中我提到过需要Finalize的对象在最终释放前会有一 次复活,我们大概可以猜到第二个参数表示的意思了。如果我们第二个参数给false,这个弱引用就是一个short weak reference(短弱引用),当GC回收时,发现根中没有这个对象的引用了,就认为这个对象无用,这时短弱引用对这个对象的跟踪到此为止,弱引用的 Target被设置为null。前面的一个参数的构造函数版本新建的弱引用为短弱引用。如果第二个参数给true,这个弱引用就是一个long weak reference(长弱引用)。在对象的Finalize方法没有被执行以前,Target都可用。不过这是对象的某些成员变量也许已经被回收,所以使 用起来要想当小心。
现在让我们看看WeakReference是如何实现的。很显然WeakReference不能直接的引用目标对象,WeakReference的 Target属性的get/set是两个函数,从某处查到目标对象的引用返回,而不是我们最常用写的那样直接返回或者设置一个私有变量。GC维护了两个列 表来跟踪两种弱引用的目标对象,在一个 WeakReference对象创建时,它在相应的列表中找到一个位置,将目标对象的引用放入,很显然,这两个列表不是根的一部分。在GC进行内存回收的 时候,如果要回收某一个对象,会检查弱引用的列表,如果保存着这个对象的引用,则将其设为null。 
public class AspPage : Page
{
private static ArrayList __ENCList = new ArrayList();

[DebuggerNonUserCode]
        public AspPage()
        {
            base.Load += new EventHandler(this.Page_Load);
            ArrayList list = __ENCList;
            lock (list)
            {
                __ENCList.Add(new WeakReference(this));
            }
        }

}

C# WeakReference相关推荐

  1. Android 弱引用 (WeakReference)的使用

    1 弱引用 (WeakReference) 弱引用对象,这些对象不会阻止对其引用对象进行终结,终结和回收.弱引用最常用于实现规范化映射.假设垃圾收集器在某个时间点确定对象是弱可到达的.到那时,它将自动 ...

  2. WeakReference回收问题

    WeakReference回收问题 这个类算是一种标记,和C的指针给人的感有点像,但是起的作用可能比指针要大.我们都知道,java虚拟机的垃圾回收算法为可达性分析算法,即在回收垃圾前对垃圾进行分析和标 ...

  3. Android学习笔记之SoftReference软引用,弱引用WeakReference

    SoftReference可以用于bitmap缓存 WeakReference 可以用于handler 非静态内部类和匿名内部类容易造成内存泄漏 private Handler mRemoteHand ...

  4. Java 引用分类:StrongReference、SoftReference、WeakReference、PhantomReference

    一,定义 在Java中,引用的定义是:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用.后面在JDK1.2开始,引用的概念被扩充,引用被分为强引用( ...

  5. java弱引用(WeakReference)和SoftReference的区别以及在android内存处理的作用

    http://mingnjintian-163-com.iteye.com/blog/1120472 weakReference一般用来防止内存泄漏,要保证内存被VM回收 softReference的 ...

  6. SAP ABAP和Java里的弱引用(WeakReference)和软引用(SoftReference)

    Jerry前一篇文章 SAP ABAP一组关键字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析 介绍了在ABAP里判断引用变量是否包含了一个有效引用的关键字:IS ...

  7. java中的softreference_Java中的SoftReference和WeakReference有什么区别?

    问题 Java中的SoftReference和WeakReference有什么区别?它们有什么不同? #1 热门回答(806 赞) 弱引用弱引用,简单地说,是一个不足以强制对象保留在内存中的引用.弱引 ...

  8. SoftReference和WeakReference

    Java2增强了内存管理功能, 增加了一个java.lang.ref包,其中定义了三种引用类.这三种引用类分别为SoftReference.WeakReference和PhantomReference ...

  9. weakreference_Java中WeakReference,SoftReference,PhantomReference和Strong Reference之间的区别...

    weakreference 很长一段时间以来,WeakReference和SoftReference都已添加到Java API中,但是并不是每个Java程序员都熟悉它. 这意味着在Java中使用Wea ...

  10. Java中WeakReference,SoftReference,PhantomReference和Strong Reference之间的区别

    很长一段时间以来,WeakReference和SoftReference都已添加到Java API中,但是并不是每个Java程序员都熟悉它. 这意味着在Java中使用WeakReference和Sof ...

最新文章

  1. ARM-CPU卷积网络的自动调谐
  2. 1115 Counting Nodes in a BST
  3. 路径规划(Path Planning)与运动规划(Motion Planning)
  4. 【原创】CSSOO的思想及CSS框架的应用(未整理完)
  5. .NET微服务体系结构中为什么使用Ocelot实现API网关
  6. 光源时间_您的国美备战时间已不足一个月!绝密国美考点、考场、光源分析送上!...
  7. centos7 源码安装goaccess
  8. kbengine 的 nginx反向代理https/wss 配置 支持kbe负载均衡
  9. 阿里云发布首个流式存储与播放解决方案
  10. Eureka学习笔记001--Eureka概念和源码分析
  11. Qt5.3.2(VS2010)_调试_进入Qt源码
  12. 越是经济下行,越是赚大钱的好机会!
  13. 双11,立减¥3554!戴尔官网撩客服砍价带走高性能电脑,速来!
  14. 腾讯觅影正式对外开放,可用AI进行医学图像分析和辅助诊疗
  15. 百度在线语音合成API接口简单应用
  16. ubuntu服务器图形界面崩溃解决方案
  17. Invalid vnode type when creating vnode: undefined. vue 3.2版本错误解决
  18. 闲云旅游项目开发-(第一篇:使用Element-ui实现主页轮播图)
  19. 英语基础语法(十二)-虚拟语气
  20. 这瓶普普通通的六神花露水,凭什么能卖到500块?

热门文章

  1. Redis事务,Redis实现悲观锁,乐观锁
  2. 王者系统不能连上聊天服务器,《王者荣耀》同城频道不能发言聊天原因 同城为什么不能发言...
  3. linux做域服务器,域主机搭建,windows,linux的加域
  4. SQL中on、where、having的区别
  5. Linux基本应用篇
  6. 求助各位朋友 帮忙安装谷歌词霸
  7. C语言直接DFT和FFTW两种方式实现离散傅里叶变换
  8. 电器厂产品发霉处理以及预防发霉方案
  9. 弱连通和强连通_判断强连通图、单向连通图、弱连通图
  10. jsplumb设置锚点_说明 · rysinal/jsPlumb Wiki · GitHub