softreference 回收_reference stacks

softreference 回收_reference stacksSoftReference和WeakReferenceJava和Android内存优化的两个类:SoftReference和WeakReferencePostedon2010-10-2200:55charley_yang阅读(436)评论(0)编辑收藏  如果你想写一个Java程序,观察某对象什么时候会被垃圾收集的执行绪清除,你必须要用一个re

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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一起使用。

Java中的SoftReference即对象的软引用。如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。使用软引用能防止内存泄露,增强程序的健壮性。  
SoftReference的特点是它的一个实例保存对一个Java对象的软引用,该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。另外,一旦垃圾线程回收该Java对象之后,get()方法将返回null。

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

HashMap<String,SoftReference<Bitmap>>cache=new HashMap<String,SoftReference<Bitmap>>();

//软引用的Bitmap对象

SoftReference<Bitmap> bitmapcache =newSoftReference<Bitmap>(bitmap);

//添加该对象到Map中使其缓存

imageCache.put(“1”,softRbitmap);

..

.

//从缓存中取软引用的Bitmap对象

SoftReference<Bitmap> bitmapcache_ =imageCache.get(“1”);

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

Bitmap bitmap_ = bitmapcache_.get();

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

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/196034.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • ubuntu pycharm2021.12 profession激活码【2021.10最新】

    (ubuntu pycharm2021.12 profession激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~F…

  • 缓冲区溢出流程

    缓冲区溢出流程缓冲区溢出流程一、ImmunityDebugger最好以管理员的身份运行Innunitydebugger通常有两种方法可以使用ImmunityDebugger来调试应用程序:确保应用

  • Eclipse开发JavaWeb项目配置Tomcat,详细教程

    Eclipse开发JavaWeb项目配置Tomcat,详细教程以下都经过本人自学时一一自己动手配置实验。首先介绍eclipse开发JavaWeb项目需要配置的相关环境,使用tomcat软件在本地搭建服务器,然后再在eclipse环境下配置tomcat:第一步:使用tomcat软件在本地搭建服务器,这个本地的tomcat服务器与eclipse环境下配置tomcat服务器都可以使用,但是只能启动一个,否则会报端口冲突,到时安装好环境会介绍tomcat

  • eclipse导入maven项目的设置

    eclipse导入maven项目的设置Eclipse配置:1.使用自己的maven:Windows-preference-maven-usersettings,更改为自己安装的maven目录下的设置文件。conf-settings.2.安装插件:Help-installnewsoftware,在workwith后的框里直接输入插件安装网址(国外软件,在线安装不推荐)Help-eclipsemarketplace,直接在搜索框搜索点击install安装(要连eclipse外网,不推荐)…

  • Qt面试笔试题问答经验总结

    Qt面试笔试题问答经验总结相信很多人和我一样,虽然经常用qt做些东西,但其实对qt理解并不是很深,尤其在岗位有相关需要的时候也会遇到很多坑。感觉网上也比较少,所以根据个人的面试经验,总结了一些面试qt的问题。答案为我自己的理解总结,有问题还请大佬指出。1.为什么要用qt来做界面Qt的跨平台性很强,比如同样一套代码写好pro文件可以在windows/linux/Android等直接编译。2.信号槽机制在事件的处理方面…

  • Android开发环境配置

    Android开发环境配置本文是Android开发环境的搭建教程,最近用到了Android开发,对环境搭建做个总结。1、安装JDK首先去官网下载JDK。JavaSeSdk下载地址:https://www.oracle.com/java/technologies/javase-downloads.html选择Windows版本。下载完成后,直接双击安装,使用默认路径C:\ProgramFiles\Java\jdk-17.0.2即可。然后配置环境变量。然后,运行CMD,输入java-version。如上图,看到

发表回复

您的电子邮箱地址不会被公开。

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