强引用和弱引用

Posted jizhiqiliao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了强引用和弱引用相关的知识,希望对你有一定的参考价值。

强引用是指向内存申请一段存储空间,进行存储的引用类型的对象的引用,如下创建一个强引用,

object obj = new object();
obj = 10;

在对象获得的分配内存空间中不仅仅存放了对象的信息,还存放着该对象被引用的次数。在创建一个强引用时,默认的引用次数为 1,之后每引用一次加 1,

object obj1 = obj;

此时,对象 obj 的引用次数为 2。相反,对对象进行弱引用并不会增加对象的引用次数,下面声明一个对 obj 的弱引用,

WeakReference wr = new WeakReference(obj);

在对象 obj 被回收之前,弱引用始终可以访问 obj,即弱引用允许应用程序访问对象,同时也允许垃圾回收器回收相应的对象。占用大量内存,但通过垃圾回收功能回收以后很容易重新创建的对象特别适合使用弱引用。使用弱引用对象的方法如下所示,

Object obj = new Object();
obj = 10;
WeakReference wr = new WeakReference(obj);
obj = null;
Object newobj = wr.Target;
if (newobj == null) // 判断是否被回收
{
    Console.WriteLine("null");
}
else
{
    Console.WriteLine(newobj);
}
Console.WriteLine(wr.IsAlive);

其中,IsAlive属性是判断此弱引用对象所引用的对象是否还存在;Target属性是设置该弱引用对象所引用的数据对象的值。

WeakReference类型提供了两个构造函数:

WeakReference(object target);
WeakReference(object target, bool trackResurrection);

target参数是弱引用要跟踪的对象。trackResurrection参数表示当对象的Finalize方法执行之后是否还要跟踪这个对象。默认这个参数是false。不跟踪复活对象的弱引用称为“短弱引用”;而要跟踪复活对象的的弱引用称为“长弱引用”。如果对象没有实现Finalize方法,那么长弱引用和短弱引用是完全一样的。应该尽量避免使用长弱引用,长弱引用允许使用复活的对象,而复活对象的行为可能是不可以预知的。

以上是关于强引用和弱引用的主要内容,如果未能解决你的问题,请参考以下文章

强引用strong和弱引用weak的定义

强符号和若符号,强引用和弱引用

Java中的强引用和弱引用

有效避免OOM--合理使用软引用和弱引用

网易游戏面试题.NET中强引用和弱引用是什么

网易游戏面试题.NET中强引用和弱引用是什么