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。


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

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

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

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

(0)


相关推荐

  • 哈希冲突原因「建议收藏」

    哈希冲突原因「建议收藏」哈希计算就是努力的把比较大的数据存放到相对较小的空间中。最常见的哈希算法是取模法。下面简单讲讲取模法的计算过程。比如:数组的长度是5。这时有一个数据是6。那么如何把这个6存放到长度只有5的数组中呢。按照取模法,计算6%5,结果是1,那么就把6放到数组下标是1的位置。那么,7就应该放到2这个位置。到此位置,哈斯冲突还没有出现。这时,有个数据是11,按照取模法,11%5=1,也等于1。那

  • mysql 数据库字符串转时间_mysql时间与字符串之间相互转换详解

    mysql 数据库字符串转时间_mysql时间与字符串之间相互转换详解1.时间转字符串DATE_FORMAT(日期,格式字符串)SELECTDATE_FORMAT(NOW(),’%Y-%m-%d%H:%i:%s’);2.字符串转时间STR_TO_DATE(字符串,日志格式)SELECTSTR_TO_DATE(‘2019-01-2016:01:45′,’%Y-%m-%d%H:%i:%s’);3.时间转时间戳selectunix_timestamp(no…

  • mysql联合索引失效

    mysql联合索引失效联合索引,能够缩小查询范围的字段放在第一个,比如表sensor_coc_repay_feature存近一个月数据两千多万条,建立联合索引(time,distinct_id),按照查询select*fromsensor_coc_repay_featurewheredistinct_id=%sandtime>‘2022-02-20’,此时然后按照联合索引最左匹配有使用到了time,distinct_id,但是经过time查询后的数据还会是全表,mysql会认为该查询还不如走全表查询

  • matlab的fread函数的用法_matlab fread 大小端

    matlab的fread函数的用法_matlab fread 大小端fread函数常见用法:1、A=fread(fileID,sizeA,precision,skip,machinefmt) 2、A=fread(fileID)3、fread(fileID,sizeA)4、A=fread(fileID,sizeA,precision)5、A=fread(fileID,sizeA,precision,skip)6、A=fread(fileID,sizeA,p

  • awk编程实战「建议收藏」

    awk编程实战「建议收藏」关于linux学习中awk的基本知识参考:linux文本编辑之awkawk分析拟南芥gff文件下载拟南芥gff文件curl-Oftp://ftp.arabidopsis.org/home/tair/Genes/TAIR10_genome_release/TAIR10_gff3/TAIR10_GFF3_genes.gff我们可以先来查看一下gff格式是什么样子的les…

发表回复

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

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