[.NET] WeakReference的使用
声明:本篇博客翻译自:http://tipsandtricks.runicsoft.com/CSharp/WeakReferences.html
由于水平(技术水平+英语理解能力)有限/不足,肯定会有所疏漏/错误,请及时指正。
在日常开发中,通常会遇到一些大对象的处理。这些大对象通常在整个程序中多次使用。例如:大文件对象,大的字典类。通常情况下我们会使用下面的方式:
作为一个方法的内置本地变量;
作为一个类的字段存在;
这两种方式都不是很好。作为一个类的字段,类的实例将一直持有这个大对象,消耗很多内存;作为一个方法的本地变量使用,当方法执行完毕,这个大对象离开了作用域,但此时不一定会被GC直接回收。造成不必要的内存消耗。且每次调用该方法时,会重新创建新的大对象,增加程序的内存消耗。
如果创建对象很消耗资源,且我们想要避免多次创建同一个对象。可以使用类的字段方式。
通常情况下,当一个对象离开了作用域,或者被设置为null。我们将无法访问到它。.NET提供了一个WeakReference类,可以完美的解决这个问题。
WeakReference对象将保存一个对象的引用即使这个对象已经离开了作用域或者被设置为null了,通过WeakReference还可以访问到这个对象。除非被GC回收掉了,WeakReference对象此时无法访问到该对象。
WeakReference的使用非常简单,
MyHugeObject hugeObject = new MyHugeObject();
WeakReference w = new WeakReference(hugeObject);
通过WeakReference的Target属性可以获得关联的对象,
MyHugeObject = w.Target as MyHugeClass;
如果这个对象仍然存在,通过Target属性可以获得到。如果对象已经被GC回收了,Target得到的值为null
static void Func()
{
MyHugeClass MyHugeObject;
if ( (w == null) || ( (MyHugeObject=w.Target as MyHugeClass) == null) )
{
MyHugeObject = new MyHugeClass();
w = new WeakReference(MyHugeObject);
}
// work with MyHugeObject
}
WeakReference提供给我们很大的好处:它将保持MyHugeObject的引用,并且确保可以在没有被GC回收的情况下重新得到该对象,且不用担心重新获得的对象是不完整的或者被损坏的。
PS:使用WeakReference并不能保证提高程序的性能,大多数情况下相比于使用本地局部变量而言性能会有所提高。但是不做任何担保。一些情况下还会出现更多的程序性能消耗,例如一个大对象关联了许多小对象,此时会将这些小对象也转成Weak Reference。此时会对GC内存回收有损耗。
参考链接:
https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/weak-references
http://tipsandtricks.runicsoft.com/CSharp/WeakReferences.html
https://msdn.microsoft.com/en-us/library/system.weakreference(v=vs.110).aspx
[.NET] WeakReference的使用的更多相关文章
- Softreference | WeakReference
转自:http://blog.csdn.net/kavendb/article/details/5935577 本文介绍对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.对象的强.软.弱 ...
- Java 引用分类:StrongReference、SoftReference、WeakReference、PhantomReference
一,定义 在Java中,引用的定义是:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用.后面在JDK1.2开始,引用的概念被扩充,引用被分为强引用( ...
- WeakReference在Handler中的应用
public class AutoActivity extends Activity { Handler handler = new Handler(){ public void handleMess ...
- android WeakReference(弱引用 防止内存泄漏)与SoftReference(软引用 实现缓存机制(cache))
在Android开发中,基本上很少有用到软引用或弱引用,这两个东东若用的很好,对自己开发的代码质量的提高有很大的帮助.若用的不好,会坑了自己.所以,在还没有真正的去了解它们之前,还是慎用比较好. 下面 ...
- 说说WeakReference弱引用
WeakReference弱引用概述 http://www.cnblogs.com/xrq730/p/4836700.html,关于Java的四种引用状态具体请参看此文 Java里一个对象obj被创建 ...
- 基础-WeakReference
一.概述 为了更好的理解WeakHashMap的原理,我们有必要先来了解一下WeakReference的作用及实现原理.Java中有一个专门的包java.lang.ref,里面定义了我们通常所说的几种 ...
- Java中引用类 strong reference .SoftReference 、 WeakReference 和 PhantomReference的区别
当在 Java 2 平台中首次引入 java.lang.ref 包,其中包含 SoftReference . WeakReference 和 PhantomReference 三个引用类,引用类的 ...
- Java引用总结--StrongReference、SoftReference、WeakReference、PhantomReference
Java引用总结--StrongReference.SoftReference.WeakReference.PhantomReference 1 Java引用介绍 Java从1.2版本开始引入了4种引 ...
- 【转】Java之WeakReference与SoftReference使用讲解
Java 2 平台引入了 java.lang.ref 包,其中包括的类可以让您引用对象,而不将它们留在内存中.这些类还提供了与垃圾收集器(garbage collector)之间有限的交互. 1.先“ ...
- Java中关于WeakReference和WeakHashMap的理解
新美大的10月11日的笔试中有一道选择题,让选择函数返回结果,代码如下: private static String test(){ String a = new String("a&quo ...
随机推荐
- [UOJ46][清华集训2014]玄学
uoj description 给出\(n\)个变换,第\(i\)个变换是将区间中\(l_i,r_i\)的数\(x\)变成\((a_ix+b_i)\mod m\). 每次会新增一个变换,或者查询询问如 ...
- 优先队列底层实现是堆(heap)(操作系统进程调度)
只有一个CPU的情况下,比如作业系统中的调度程序,当一个作业完成后,需要在所有等待调度的作业中选择一个优先级最高的作业来执行(删除),并且也可以添加一个新的作业到作业的优先队列中(插入). 插入操作 ...
- ambassador 学习二 认证
ambassador 可以在请求路由之前进行认证处理,一般的我们可能会使用第三方的认证服务 基本的环境安装可以参考相关文档 安装&&运行qotm 服务 可以参考官方文档,或者https ...
- Telnet远程重启路由器TP-LINK
突然断网,以前房东的路由器管理页面可以打开,今天突然间就打不开了.ping了下,可以ping通,于是就想起了房东的路由器是TP-LINK的 可以 telnet登陆的.每次,断网,我都会重启房东的路由器 ...
- java程序运行时内存分配详解
java程序运行时内存分配详解 这篇文章主要介绍了java程序运行时内存分配详解 ,需要的朋友可以参考下 一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个 ...
- ffmpeg+nginx+video实现rtsp流转hls流,通过H5查看监控视频
一.FFmpeg下载:http://ffmpeg.zeranoe.com/builds/ 下载并解压FFmpeg文件夹,配置环境变量:在“Path”变量原有变量值内容上加上d:\ffmpeg\bin, ...
- Quartz教程
Quartz教程 Quartz教程四--Trigger介绍 Quartz教程八--SchedulerListener 08-24 Quartz教程七--TriggerListener和JobLis ...
- guicorn 是什么
guicorn 是什么? 在回答问题之前我们先来看看 web服务器的典型过程[1] 1. 建立链接:如果没有连接,要建立连接 2. 接收请求:对客户端发来的请求进行解析. 3. 处理请求:转发给预定义 ...
- JDK8时间格式转换
来源:https://blog.csdn.net/zhangzijiejiayou/article/details/76597329 LocalDateTime 本地日期时间 LocalDateTim ...
- logger 的使用 二logback使用配置详解
下面是一些最基本的,详细的参考:https://logback.qos.ch/manual/index.html 我的使用:把error日志打印在另一个文件,可以用ELK 统一管理 最近使用: < ...