声明:本篇博客翻译自: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的使用的更多相关文章

  1. Softreference | WeakReference

    转自:http://blog.csdn.net/kavendb/article/details/5935577 本文介绍对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.对象的强.软.弱 ...

  2. Java 引用分类:StrongReference、SoftReference、WeakReference、PhantomReference

    一,定义 在Java中,引用的定义是:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用.后面在JDK1.2开始,引用的概念被扩充,引用被分为强引用( ...

  3. WeakReference在Handler中的应用

    public class AutoActivity extends Activity { Handler handler = new Handler(){ public void handleMess ...

  4. android WeakReference(弱引用 防止内存泄漏)与SoftReference(软引用 实现缓存机制(cache))

    在Android开发中,基本上很少有用到软引用或弱引用,这两个东东若用的很好,对自己开发的代码质量的提高有很大的帮助.若用的不好,会坑了自己.所以,在还没有真正的去了解它们之前,还是慎用比较好. 下面 ...

  5. 说说WeakReference弱引用

    WeakReference弱引用概述 http://www.cnblogs.com/xrq730/p/4836700.html,关于Java的四种引用状态具体请参看此文 Java里一个对象obj被创建 ...

  6. 基础-WeakReference

    一.概述 为了更好的理解WeakHashMap的原理,我们有必要先来了解一下WeakReference的作用及实现原理.Java中有一个专门的包java.lang.ref,里面定义了我们通常所说的几种 ...

  7. Java中引用类 strong reference .SoftReference 、 WeakReference 和 PhantomReference的区别

      当在 Java 2 平台中首次引入 java.lang.ref 包,其中包含 SoftReference . WeakReference 和 PhantomReference 三个引用类,引用类的 ...

  8. Java引用总结--StrongReference、SoftReference、WeakReference、PhantomReference

    Java引用总结--StrongReference.SoftReference.WeakReference.PhantomReference 1 Java引用介绍 Java从1.2版本开始引入了4种引 ...

  9. 【转】Java之WeakReference与SoftReference使用讲解

    Java 2 平台引入了 java.lang.ref 包,其中包括的类可以让您引用对象,而不将它们留在内存中.这些类还提供了与垃圾收集器(garbage collector)之间有限的交互. 1.先“ ...

  10. Java中关于WeakReference和WeakHashMap的理解

    新美大的10月11日的笔试中有一道选择题,让选择函数返回结果,代码如下: private static String test(){ String a = new String("a&quo ...

随机推荐

  1. 白帽子讲web安全——一个安全解决方案的诞生细节

    1.白帽子:做安全的人.主要做的事,防御,是制定一套解决攻击的方案.而不是只是解决某个漏洞. 2.黑帽子:现在说的黑客.让web变的不安全的人.利用漏洞获取特权.主要做的事,攻击,组合各种方法利用漏洞 ...

  2. brave-zipkin的日志源码分析

    其实在zipkin的日志里面作为发送端日志两个,sr,ss,这个日志是servlet产生的:接收端日志是四个,分别是cr,sr,ss,cs:cr和cs分别是上游的日志的信息:ss和sr是接收端输出的日 ...

  3. GCC参数详解 二

    1简介 2简单编译 2.1预处理 2.2编译为汇编代码(Compilation) 2.3汇编(Assembly) 2.4连接(Linking) 3多个程序文件的编译 4检错 5库文件连接 5.1编译成 ...

  4. mamp下安装ruby的mysql库

    mysql2库死活不行,用ruby-mysql得了,纯ruby的库 gem "ruby-mysql" require 'mysql'

  5. 黄聪:WordPress 多站点建站教程(四):获取子站点相关信息(站点的注册时间,修改时间,总文章数,URL等)

    1.获取子站点blogs表里面的内容信息 $blog_details = get_blog_details(1); echo 'Blog '.$blog_details->blog_id.' i ...

  6. Golang基础学习总结

    转自:http://blog.csdn.net/yue7603835/article/details/44264925 1.不支持继承.重载 ,比如C++.Java的接口,接口的修改会影响整个实现改接 ...

  7. 软件测试——Peer Review

    一.什么是peer review peer review是一种通过作者的同行来确认缺陷和需要变更区域的检查方法.需要进行同行评审的特定产品在定义项目软件过程的时候被确定并且作为软件开发计划的一部分被安 ...

  8. socket与http的区别

    ---------------------------------------------------------------------------------------------------- ...

  9. Httpservlet源码说明

    上一篇看了Servlet接口,现在来看下我们经常涉及的Httpservlet: /** * * Provides an abstract class to be subclassed to creat ...

  10. MVC中@Html.Action的用法

    MVC项目中如果有公共部分的代码就可以单独拿出来作为控件来用(比如头部和底部代码).跟ASP.NET中的ASCX实现的效果一样,但MVC比它方便的多. 想要实现该效果,需要知道@Html.Action ...