softreference 回收_method verification

softreference 回收_method verification一、softReference的作用    SoftReference的主要特点就是在当内存不够的时候,GC会回收SoftReference所引用的对象。所以,在memorysensitive的项目中将某些数据设置成SoftReference可以避免内存的溢出。1、创建一个SoftReferenceSoftReference>softReference=newSof

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

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

一、softReference的作用

       SoftReference的主要特点就是在当内存不够的时候,GC会回收SoftReference所引用的对象。所以,在memory sensitive的项目中将某些数据设置成SoftReference可以避免内存的溢出。

1、创建一个SoftReference

SoftReference<Map<String, String>> softReference = new SoftReference<Map<String, String>>(new HashMap<String, String>());

2、使用softReference

Map<String, String> map = softReference.get();
if (map == null) {
    softReference = new SoftReference<Map<String, String>>(
        map = new HashMap<String, String>());
}

3、因为是SoftReference,有可能已经被GC回收了,所以需要判断softReference.get()的返回值是否为null。如果是的话,就再重新new一个。注意这里的map赋值代码,如果写成这样:

Map<String, String> map = softReference.get();
if (map == null) {
    softReference = new SoftReference<Map<String, String>>(
        new HashMap<String, String>());
}
map = softReference.get();

GC有可能发生在softReference = new SoftReference<Map<String, String>>(new HashMap<String, String>())和map = softReference.get();之间,那么map仍然有可能为null,虽然这种几率小到几乎不存在。

4、SoftReference设计对象Cache

   SoftReference是强引用,它保存的对象实例,除非JVM即将OutOfMemory,否则不会被GC回收。这个特性使得它特别适合设计对象Cache。对于Cache,我们希望被缓存的对象最好始终常驻内存,但是如果JVM内存吃紧,为了不发生OutOfMemoryError导致系统崩溃,必要的时候也允许JVM回收Cache的内存,待后续合适的时机再把数据重新Load到Cache中。这样可以系统设计得更具弹性。

实例:

软引用在设备内存比较少的时候特别有用,比如Android系统。

  一个android应用如果设计到通过网络获取图片,为了让系统更快的运行和更节省流量我们可以将已经下载下来的图片缓存起来,当第二次浏览到该图片时就可以从缓存中拿。

  缓存的方式有:一是放在系统内存中这样效率最高,二是把文件写到外部存储器上。但是就目前而言android系统的内存是非常的有限的不可能像PC机那样配置那么高的内存,而且外部存储器的容量也是有限的。

public class ImageLoader {  
      
    private Map<String,SoftReference<Bitmap>> cacheImage = new HashMap<String,SoftReference<Bitmap>>();  
      
    public void loadImage(final String path,final Callback callback){  
        SoftReference<Bitmap> softReference = cacheImage.get(path);  
        if(softReference!=null){  
            Bitmap bm = softReference.get();  
            if(bm!=null){  
                callback.execute(bm);  
                return;  
            }  
        }  
        new Thread(new Runnable() {  
           public void run() {  
            HttpClient client = new DefaultHttpClient();  
            try {  
                HttpResponse response = client.execute(new HttpGet(path));  
                HttpEntity entity = response.getEntity();  
                byte []bs= EntityUtils.toByteArray(entity);  
                final Bitmap bm = BitmapFactory.decodeByteArray(bs, 0,bs.length);  
                SoftReference<Bitmap> reference = new SoftReference<Bitmap>(bm);   
                cacheImage.put(path,reference);  
                callback.execute(bm);  
                entity.consumeContent();  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            }  
        }).start();  
    }  
      
    public static abstract class Callback{  
        abstract void execute(Bitmap bm);  
    }  
}  

注:

WeakReference是弱引用,其中保存的对象实例可以被GC回收掉。这个类通常用于在某处保存对象引用,而又不干扰该对象被GC回收,通常用于Debug、内存监视工具等程序中。因为这类程序一般要求即要观察到对象,又不能影响该对象正常的GC过程。

最近在JDK的Proxy类的实现代码中也发现了Weakrefrence的应用,Proxy会把动态生成的Class实例暂存于一个由Weakrefrence构成的Map中作为Cache。


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

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

(0)
上一篇 2025年10月8日 上午7:01
下一篇 2025年10月8日 上午7:43


相关推荐

  • [Windosw Erro 1114] 动态链接库(Dll)初始化例程失败

    [Windosw Erro 1114] 动态链接库(Dll)初始化例程失败最近在弄 python 调用 C 的 dll 但是 Ctypes 的接口头文件中只能放 C 类型的 所以我将 C 的一个类放在 CPP 里面的全局 作为一个全局变量可以给接口函数调用 但是在 python 调用的时候出现了 WindoswErro1 动态链接库 Dll 初始化例程失败的错误 经过 1 天的反复排查 最后发现是因为这个全局对象初始化的时候失败了导致 dll 不能加载 但是我之前写的 dll 也是将对象放

    2026年3月26日
    1
  • linux根分区满了如何处理,查找大文件方法[通俗易懂]

    linux根分区满了如何处理,查找大文件方法[通俗易懂]linux根分区满了如何处理,查找大文件方法

    2022年4月21日
    145
  • 各大OJ刷题平台汇总

    前言想成为一名高级工程师,算法还是要有的,至少在入门编程和进入公司之前都是必备的。刷题也可以很好的锻炼动手能力和逻辑思维,今天就给大家介绍一些知名的在线刷题平台,都是干货哦!力扣(leetcode)江湖人尽皆知的站点,全球知名的编程平台!总部在美国旧金山的硅谷,创办与2011年,2018年进入中国,并推出付费服务,19年推出力扣App。力扣为全球程序员提供了专业的IT技术职业化提升平台,有效帮助程序员实现快速进步和长期成长(度说)。特点:支持c++,c,java,python,Rust,kot

    2022年4月4日
    1.0K
  • vShpere云操作系统之六在HA中安装虚拟机及进行ha测试

    vShpere云操作系统之六在HA中安装虚拟机及进行ha测试

    2021年7月31日
    60
  • 《深入浅出WPF》——模板学习

    《深入浅出WPF》——模板学习一、前言    图形用户界面(GUI,GraphicUserInterface)应用较之控制台界面(CUI,CommandUserInterface)应用程序最大的好处就是界面友好、数据显示直观。CUI程序中数据只能以文本的形式线性显示,GUI程序则允许数据以文本、列表、图形等多种形式立体显示。  用户体验在GUI程序设计中起着举足轻重的作用——用户界面设计成什么样子看上去才够漂亮?控件如何安排才简单易用并且少犯错误?(控件并不是越复杂

    2022年7月19日
    40
  • C语言最大公约数和最小公倍数

    C语言最大公约数和最小公倍数首先我们应该知道最大公约数和最小公倍数的基本概念最大公约数:指两个或多个整数共有约数中最大的一个最小公倍数:俩数相乘除以最大公约数一、最大公约数方法一:先令最大公约数max为1,当俩个数x、y都能被循环变量i整除时,把循环变量i赋值给最大公约数max,这样在循环结束后,就求得了最大公约数,但是这种做法过于复杂,耗时。方法二:先比较俩数的大小,然后::::;用两数中的较大数除以较…

    2022年5月17日
    42

发表回复

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

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