.net 中的WeakReference

简介:

我们平常用的都是对象的强引用,如果有强引用存在,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都可用。不过这是对象的某些成员变量也许已经被回收,所以使 用起来要想当小心。

 

参考博客:http://www.cnblogs.com/bayonetxxx/archive/2009/06/02/1494728.html

 

本文转自JustRun博客园博客,原文链接:http://www.cnblogs.com/JustRun1983/archive/2013/02/03/2890920.html,如需转载请自行联系原作者

目录
相关文章
|
8月前
java.net.BindException: Address already in use: 解决方法
java.net.BindException: Address already in use: 解决方法
91 0
|
设计模式 数据库 容器
.NET Core 中对象池(Object Pool)的使用
.NET Core 中对象池(Object Pool)的使用
156 0
|
存储 缓存
.Net Core MemoryCache
这里介绍的微软的缓存
191 0
|
存储 开发框架 Java
|
监控 安全 Java
.NET垃圾回收
1 在.NET中的自动内存管理由垃圾回收器来执行,GC 全权负责对托管堆的内存管理. 2 对于开发人员来说,GC全权负责对内存的管理,监控和回收,我们应将更多的努力关于于非托管资源的清理方式的理解和应用上,以提升系统资源管理的性能和安全 一个对象不被任何外部对象引用时则被认定为垃圾。
596 0
|
Java .NET
[转载] .NET 中可以有类似 JVM 的幻像引用吗?
近日发现一篇不错的文章,文中列举了一些 GC 场景,探讨了 在 .NET 中是需要实现像 JVM 的中的幻像引用。有人质疑其不切实际,也有像 Ayende 大神一言不合就自己做了个 demo。 Do we need JVM’s PhantomReference in .
1276 0
|
Java C# C++
关于更清楚地了解.net的垃圾回收机制
对非托管资源的隐式控制是由析构方法提供的,它会在对象销毁时由垃圾回收器调用。 析构方法应该只释放对象占用的资源,而不应该引用其他对象。请注意,如果只有托管引用,就无需也不应该实现析构方法,它只适用于处理非托管资源。
1069 0
|
传感器 开发框架 安全