Office中国论坛/Access中国论坛
标题:
【原创】关于:弱引用(WeakReference)
[打印本页]
作者:
faunus
时间:
2014-2-23 10:28
标题:
【原创】关于:弱引用(WeakReference)
(弱引用)
[1]强引用
如果有强引用存在,GC是不会回收对象的。
[2]弱引用
弱引用可以让您保持对对象的引用,
同时允许GC在必要时释放对象,回收内存。
[3]弱引用使用场景
对于那些创建便宜但耗费大量内存的对象,
希望保持该对象,又要在应用程序需要时使用,
同时希望GC必要时回收时,可以考虑使用弱引用。
作者:
faunus
时间:
2014-2-23 10:28
单参数版
using System;
class MyClass
{
static void Main(string[] args)
{
Object obj = new Object();
WeakReference wref = new WeakReference(obj);
obj = null;
Object obj2 = wref.Target;
if (obj2 != null)
{
// 做你想做的事吧。
}
else
{
// 对象已经被回收,如果要用必须新建一个。
}
Console.ReadKey();
}
}
作者:
faunus
时间:
2014-2-23 10:28
双参数复活版
using System;
class MyClass
{
static void Main(string[] args)
{
//第二个参数让我们看一下他的原型,bool trackResurrection,
//跟踪复活,是个bool型,就是是否跟踪复活。
Object obj1 = new Object();
Object obj2 = new Object();
WeakReference wref1 = new WeakReference(obj1, false);
WeakReference wref2 = new WeakReference(obj2, true);
Console.ReadKey();
}
}
作者:
faunus
时间:
2014-2-23 10:28
需要Finalize的对象在最终释放前会有一次复活,第二个参数的作用。
[1]短引用
第二个参数给false,这个弱引用就是一个short weak reference(短弱引用),
当GC回收时,发现根中没有这个对象的引用了,就认为这个对象无用,
这时短弱引用对这个对象的跟踪到此为止,弱引用的 Target被设置为null。
[2]长引用
如果第二个参数给true,这个弱引用就是一个long weak reference(长弱引用)。
在对象的Finalize方法没有被执行以前,Target都可用。
不过这是对象的某些成员变量也许已经被回收,所以使用起来要想当小心。
[3]finalize对象“复活”
short weak reference会忽略,即wr.Target会置null,
而long weak reference则会跟踪,wr.Target仍然refer to 原对象,这个是两者的最大区别。
如果没有finalize,则两种weak reference表现完全相同。
原理:
GC维护了两个列表来跟踪两种弱引用的目标对象,
在一个 WeakReference对象创建时,
它在相应的列表中找到一个位置,
将目标对象的引用放入,
很显然,这两个列表不是根的一部分。
在GC进行内存回收的时候,如果要回收某一个对象,
会检查弱引用的列表,如果保存着这个对象的引用,
则将其设为null。
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/)
Powered by Discuz! X3.3