`
Kingson_Wu
  • 浏览: 123644 次
文章分类
社区版块
存档分类
最新评论

WeakReference(弱引用)

 
阅读更多

一:什么是弱引用

了解弱引用之前,先了解一下什么是强引用

  例如:Objectobj=newObject();就是一个强引用,内存分配一份空间给用以存储Object数据,这块内存有一个首地址,也就是obj所保存的数据,内存分配的空间中不仅仅保存着Object对象信息,还保存着自己(Object本身)被引用的次数。

  当一个对象被强引用的形式创建的时候,本身被引用的次数已经为1.

  接着Objecto=obj;这句代码执行之后,obj指向的Object的存储空间已经被引用了2次,所以Object保存的被引用数值为2.

  总结:强引用最终导致的结果就是被引用的对象的被引用次数+1;

  相反的弱引用就是不会对被引用对象的被引用次数有任何影响。

二:弱引用有什么作用

  防止内存泄露。

  Objectobj=newObject();

  当你在通过异步的形式访问网络上面的资源的时候,需要的时间可能会比较长,在数据返回之前,用户很可能转向了其他的页面,如果异步访问的对象(obj)对本地的一个对象(Object)是强引用的话,那么在这个异步访问对象(obj)被释放之前,也即在数据被回调之前,这个被引用的对象(Object)是不会被销毁的,这样一来,就导致内存一直被占用

WeakReferenceweakObj=newWeakReference(Object);

  此时就可以使用弱引用,弱引用对象(weakObj)发出异步请求,在回调之前,如果用户要转到其他的页面,这个被引用的对象(Object)可以被释放的,这样子就不会出现内存一直被占用的现象。

三:怎样使用弱引用

  弱引用类:WeakReference//有两个重载的构造函数

  WeakReferenceWeakObj=newWeakReference(Object);//弱引用方式

IsAlive属性是判断此弱引用对象所引用的对象是否还存在,存在:IsAlive=True;

Target属性是设置该弱引用对象所引用的数据对象的值

MSDN:http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k%28SYSTEM.WEAKREFERENCE%29;k%28WEAKREFERENCE%29;k%28TargetFrameworkMoniker-%22SILVERLIGHT%2cVERSION%3dV4.0%22%29;k%28DevLang-CSHARP%29&rd=true

WeakReference(弱引用)

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

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

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

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

Objectobj1=newObject();

Objectobj2=newObject();

WeakReferencewref1=newWeakReference(obj1,false);

WeakReferencewref2=newWeakReference(obj2,true);

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

[DebuggerNonUserCode]
publicAspPage()
{
base.Load+=newEventHandler(this.Page_Load);
ArrayListlist=__ENCList;
lock(list)
{
__ENCList.Add(newWeakReference(this));
}
}
}

分享到:
评论

相关推荐

    WeakReference(弱引用)让GC需要时回收对象

    在.NET中,弱引用通过System.WeakReference类来实现。创建弱引用时,我们可以传递两个参数,第一个是目标对象的引用,第二个是可选的布尔值,指示是否要跟踪对象的复活(trackResurrection)。根据第二个参数的不同...

    SoftReference、WeakReference和PhantomRefrence分析和比较

    WeakReference(弱引用) 弱引用是 Java 中的一种特殊的引用类型,它们可以和 GC 做交互,以满足不同的应用场景。弱引用可以用于解决一些特殊的问题,如避免内存溢出、实现缓存机制等。 PhantomReference(虚...

    Android中的软引用和弱引用

    在这个过程中,软引用(Soft Reference)和弱引用(Weak Reference)是两种非常重要的工具,它们可以帮助我们避免内存泄漏,提高应用的内存效率。下面我们将深入探讨这两种引用类型及其在Android中的应用。 首先,...

    android内存优化详解

    为避免这类问题,应避免使用静态变量引用Context,优先使用ApplicationContext,或者使用WeakReference弱引用。 线程也是引发内存泄露的常见原因。线程内部持有的对象如果长时间存活,可能会导致原本应被释放的对象...

    java弱引用

    弱引用是 Java.lang.ref.WeakReference 类的实例,它们提供了一种方式来引用对象,而不阻止垃圾回收器回收这些对象。 在 Java 中,引用可以分为四类:强引用、软引用、弱引用和虚引用(也称为精灵引用)。弱引用是...

    ThreadLocal的简单理解.doc

    其次,ThreadLocalMap 是 ThreadLocal 中定义的一个类,可以简单地将它理解成一个 Map,不过它的 key 是 WeakReference 弱引用类型。这意味着,当这个值没有在别的地方引用时,在发生垃圾回收时,这个 map 的 key 会...

    详解Java弱引用(WeakReference)的理解与使用

    Java 弱引用(WeakReference)的理解与使用 Java 中的弱引用(WeakReference)是一种特殊的引用类型,它可以帮助我们更好地管理内存和避免内存泄漏。在 Java 中,当一个对象被创建时,它被放在堆(Heap)中。当垃圾...

    WeakDelegate,Weakreference财产委托提议.zip

    在IT行业中,尤其是在Android或Java开发中,弱引用(WeakReference)是一个重要的概念,它用于内存管理,防止内存泄漏。这个“WeakDelegate,Weakreference财产委托提议.zip”项目显然是一个Kotlin实现的开源项目,旨在...

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

    强引用、弱引用、软引用和虚引用是四种不同的引用强度,它们在垃圾回收机制中扮演着不同的角色。了解这些引用类型对于优化内存使用、防止内存泄漏以及合理地控制对象生命周期至关重要。 1. **强引用(Strong ...

    Java引用总结--StrongReference、SoftReference、WeakReference、PhantomRef

    弱引用(WeakReference)弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会...

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

    ### Java中的软引用、弱引用和虚引用详解 #### 一、引言 在Java开发过程中,特别是Android应用开发中,经常会遇到一个普遍的问题——内存溢出(OutOfMemory Error,简称OOM)。这个问题往往与如何有效地管理内存...

    Java 7之基础 - 强引用、弱引用、软引用、虚引用1

    程序员可以使用`WeakReference`类创建弱引用。 3. **软引用(Soft Reference)** - **定义**:软引用比弱引用稍强一些,它表示那些对系统资源还有一定价值的对象引用。只有当系统内存不足时,才会回收被软引用指向...

    十分钟理解Java中的弱引用编程开发技术共3页.pdf.z

    我们主要关注弱引用,它通过`WeakReference`类来实现。弱引用对象在创建时不会阻止垃圾回收,当进行垃圾回收时,无论是否还有弱引用指向,都会回收目标对象。 使用弱引用的例子之一是缓存。假设我们有一个键值对...

    详解 JAVA 弱引用

    JAVA 弱引用是JAVA语言中的一种特殊的引用类型,它使用WeakReference类来实现。弱引用是一种非必需对象的描述,它比软引用更弱。在发生GC时,只要发现弱引用,不管系统堆空间是否足够,都会将对象进行回收。 弱引用...

    强应用软引用弱引用与垃圾收集的关系1

    本文将深入探讨强引用、软引用、弱引用以及幻象引用这四种引用类型,以及它们与垃圾收集的关系。 1. **强引用(Strong Reference)**: - 强引用是Java中最常见的引用类型,它代表了一个对象的直接访问路径。只要...

    10分钟带你理解Java中的弱引用

    在Java中,弱引用由`java.lang.ref.WeakReference<T>`类表示。官方文档指出,弱引用的对象不会阻止它所指向的对象被垃圾回收器回收。即使有弱引用指向一个对象,只要没有其他强引用存在,垃圾收集器就会回收这个对象...

    Java中弱引用和软引用的区别以及虚引用和强引用介绍

    2. **弱引用(WeakReference)** - 弱引用不会阻止对象被垃圾回收,只要发现对象仅被弱引用指向,垃圾回收器就会立即将其回收,不论系统是否有足够的内存。 - 示例:`WeakReference<Counter> weakCounter = new ...

    Java对象的强、软、弱和虚引用1

    3. **弱引用(WeakReference)**: 相比于软引用,弱引用的对象拥有更短的生命周期。在垃圾回收器扫描时,无论内存是否足够,都会回收弱引用的对象。弱引用也与引用队列配合使用,回收时加入队列。弱引用适合那些...

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

     Java中的弱引用具体指的是java.lang.ref.WeakReference类,我们首先来看一下官方文档对它做的说明:  弱引用对象的存在不会阻止它所指向的对象变被垃圾回收器回收。弱引用常见的用途是实现规范映射...

Global site tag (gtag.js) - Google Analytics