SoftReference 和 WeakReference

SoftReference 和 WeakReferenceSoftReferenc 和 WeakReferenc 和 Android 内存优化的两个类 SoftReferenc 和 WeakReferenc 10 2200 55charley yang 阅读 436 评论 0 编辑收藏 nbsp nbsp 如果你想写一个 Java 程序 观察某对象什么时候会被垃圾收集的执行绪清除 你必须要用一个 re

SoftReference 和 WeakReference

Java 和
Android 内存优化的两个类:SoftReference 和 WeakReference

Posted on 2010-10-22 00:55 charley_yang 阅读(436) 评论(0) 编辑 收藏  
如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集的执行绪清除,你必须要用一个 reference 记住此对象,以便随时观察,但是却因此造成此对象的 reference 数目一直无法为零, 使得对象无法被清除。
view sourceprint?
1 java.lang.ref.WeakReference
  不过,现在有了 Weak Reference 之后,这就可以迎刃而解了。如果你希望能随时取得某对象的信息,但又不想 影响此对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象,而不是用一般的 reference。
view sourceprint?
01      A obj = new A();  
02   
03     WeakReference wr = new WeakReference(obj);  
04   
05     obj = null;  
06   
07     //等待一段 时间,obj对象就会被垃圾回收
08   …  
09   
10   if (wr.get()==null) {  
11   System.out.println(“obj 已经被清除了 “);  
12   } else {  
13   System.out.println(“obj 尚未被清除,其信息是 “+obj.toString());
14   }
15   …
  在此例中,透过 get() 可以取得此 Reference 的所指到的对象,如果传出值为 null 的话,代表此对象已经被清除。
  这类的 技巧,在设计 Optimizer 或 Debugger 这类的程序时常会用到,因为这类程序需要取得某对象的信息,但是不可以 影响此对象的垃圾收集。
  java.lang.ref.SoftReference
  Soft Reference 虽然和 Weak Reference 很类似,但是用途却不同。 被 Soft Reference 指到的对象,即使没有任何 Direct Reference,也不会被清除。一直要到 JVM 内存不足时且 没有 Direct Reference 时才会清除,SoftReference 是用来设计 object-cache 之用的。如此一来 SoftReference 不但可以把对象 cache 起来,也不会造成内存不足的错误 (OutOfMemoryError)。我觉得 Soft Reference 也适合拿来实作 pooling 的技巧。
view sourceprint?
01 A obj = new A();  
02  
03 SoftRefenrence sr = new SoftReference(obj);  
04  
05 引用时  
06  
07 if(sr!=null){  
08  
09     obj = sr.get();  
10  
11 }else{  
12  
13     obj = new A();  
14  
15     sr = new SoftReference(obj);  
16  

17 }

  • 在Java中内存管理,引用分为四大类:强引用HardReference、弱引用WeakReference、软引用SoftReference和虚引用PhantomReference。
  • 它们的区别也很明显,HardReference对象是即使虚拟机内存吃紧抛出OOM,也不会导致这一引用的对象被回收;而WeakReference等更适合于一些数量不多,但体积稍微庞大的对象,在这四个引用中,它是最容易被垃圾回收的;而我们对于显示类似Android Market中每个应用的AppIcon时可以考虑使用SoftReference来解决内存不至于快速回收,同时当内存短缺面临JavaVM崩溃抛出OOM前时,软引用将会强制回收内存,最后的虚引用一般没有实际意义,仅仅观察GC的活动状态,对于测试比较实用同时必须和ReferenceQueue一起使用。

用Map集合缓存软引用的Bitmap对象
HashMap

>cache=new HashMap

>();

//软引用的Bitmap对象
SoftReference

bitmapcache =newSoftReference

(bitmap);

//添加该对象到Map中使其缓存
imageCache.put(“1”,softRbitmap);
..
.
//从缓存中取软引用的Bitmap对象
SoftReference

bitmapcache_ =imageCache.get(“1”);

//取出Bitmap对象,如果由于内存不足Bitmap被回收,将取得空

Bitmap bitmap_ = bitmapcache_.get();

如果程序中需要从网上加载大量的图片 这时就考虑采用在sdcard上建立临时文件夹缓存这些图片了





























































版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229116.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午5:26
下一篇 2026年3月16日 下午5:26


相关推荐

  • JavaScript Scripting.FileSystemObject FSO属性大全

    JavaScript Scripting.FileSystemObject FSO属性大全
    什么是FSO?
    FSO即FileSystemObject文件系统对象,是一种列表Windows磁盘目录和文件,对目录和文件进行删除、新建、复制、剪切、移动等操作的技术。使用FSO网站的好处:直接读取目录下的文件和子目录,方便维护,如需要添加任何内容,将文件放在相应的目录下即可;FSO网站类似Windows操作界面,易于使用,会使用Windows就会使用FSO网站。
    试想一下,很方便的就可以将您硬盘中的文件和文件夹制作成网站,并且日后只要把内

    2022年7月14日
    18
  • 00005__VSCode__xml格式化代码插件

    00005__VSCode__xml格式化代码插件1XML或HTML格式化代码缩进安装插件:Vetur2格式化代码的快捷键如下OnWindows:Shift+Alt+FOnMac:Shift+Option+FOnUbuntu:Ctrl+Shift+I

    2022年7月16日
    31
  • 分布式列式数据库HBase

    分布式列式数据库HBase本文概述 1 HBase 概述 2 HBase 特点 3 HBase 和 RDBMS 以及 HDFS 的对比区别 4 HBase 核心术语 5 HBase 物理模型 6 HBase 架构 7 HBase 容错 8 HBase 环境搭建 HBase 官网 http hbase apache org ApacheHBase 是一个开源 分布式 版本化的非关系型数据库 HBase 概述 1 构建在 HDFS 之上的 分布式 面向列的开源数据库

    2026年3月17日
    2
  • shell循环生成连续日期

    shell循环生成连续日期1,给定长度,循环生成日期begin_day=-5end_day=0for((i=${begin_day};i<=${end_day};i++));do day=`date-d”${i}days”+”%Y%m%d”` echo${day}done输出为:2020082520200826202008272020082820200829202008302,给定开始日期和结束日期,循环生成日期。begin_day=”20200801″end_day=”2020

    2022年7月24日
    9
  • 华为的面试经历

    华为的面试经历

    2021年12月1日
    54
  • 从工具精通到商业变现:AI浪潮下,为何多数人止步于“收藏家”?

    从工具精通到商业变现:AI浪潮下,为何多数人止步于“收藏家”?

    2026年3月17日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号