设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1778|回复: 3
打印 上一主题 下一主题

【原创】关于:弱引用(WeakReference)

[复制链接]
跳转到指定楼层
1#
发表于 2014-2-23 10:28:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
(弱引用)

[1]强引用
如果有强引用存在,GC是不会回收对象的。
[2]弱引用
弱引用可以让您保持对对象的引用,
同时允许GC在必要时释放对象,回收内存。
[3]弱引用使用场景
对于那些创建便宜但耗费大量内存的对象,
希望保持该对象,又要在应用程序需要时使用,
同时希望GC必要时回收时,可以考虑使用弱引用。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2014-2-23 10:28:21 | 只看该作者
单参数版


  • 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();  
  •     }  
  • }  





3#
 楼主| 发表于 2014-2-23 10:28:39 | 只看该作者
双参数复活版


  • 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();  
  •     }  
  • }  





4#
 楼主| 发表于 2014-2-23 10:28:52 | 只看该作者
需要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。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-7 23:44 , Processed in 0.091625 second(s), 27 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表