了解下SoftReference
昨天同事看到别人一段关于实现缓存功能的代码,看完之后他有点不明觉厉,哈哈,然后就给周围同事也看了下,可能之前大家都没用过SoftReference,所以并不明白是如何实现的。
于是我就把代码要了过来,准备晚上回去看下,回家后做完饭,吃完饭,还顺便看了下恒大的比赛,之后想起来代码还没看,于是就打开电脑,开始琢磨他的代码。
那段代码其实就是实现了缓存功能,限量存储,且还带"定时删除"功能,我那个同事就在琢磨是咋定时删除的,我也想知道是咋删除的,下班前大概浏览了下代码,由于之前没用过SoftReference,所以还猜测是不是SoftReference有定时删除功能,但看了下SoftRefercence API好像没有这个功能。所以我回来后,就仔细浏览下写的代码,其实所谓的定时删除代码,并没有删除,而是代码里变通的用了个方法,在SoftReference所引用的对象上附加了一个超时时间值,所以在获取该对象值时,用当前时间与引用对象的超时时间进行对比,如果超时时间已经小于当前时间,那就认为该对象无效了,就实现了所谓的"定时删除"功能。
但琢磨不能仅限于此啊,为什么会用到SoftReference对象呢?
又google了相关SoftReference的介绍,发现果然很多都是说SoftReference是常在设计缓存时用到,而且也看到SoftReference jdk api中关于该类有一段介绍如下:
Soft reference objects, which are cleared at the discretion of the garbage collector in response to memory demand. Soft references are most often used to implement memory-sensitive caches。
也就是SoftReference所引用的对象会在内存不足时,由GC来裁决是否将其回收,它也最长被用来实现对内存敏感的缓存设计。
于是就想那到底啥时候会来回收呢?
搜到一遍很有价值的文章,看作者自我介绍时Google的一位牛人,还是JSR一员。文章地址
截取关键如下:
When a garbage collection occurs, the decision to clear a SoftReference is based on two factors:
- How old the reference's timestamp is, and
- How much free space there is in memory.
The calculation is pretty simple. If:
- free_heap is the amount of free heap space in MB,
- interval is the time between the last GC's clock and the timestamp of the ref we are currently examining, and
- ms_per_mb is a constant number of milliseconds to keep around a SoftReference for each free megabyte in the heap
Then the decision is made by:
interval <= free_heap * ms_per_mb
了解下SoftReference的更多相关文章
- 万字长文深入理解java中的集合-附PDF下载
目录 1. 前言 2. List 2.1 fail-safe fail-fast知多少 2.1.1 Fail-fast Iterator 2.1.2 Fail-fast 的原理 2.1.3 Fail- ...
- C++程序结构---1
C++ 基础教程Beta 版 原作:Juan Soulié 翻译:Jing Xu (aqua) 英文原版 本教程根据Juan Soulie的英文版C++教程翻译并改编. 本版为最新校对版,尚未定稿.如 ...
- Java 引用分类:StrongReference、SoftReference、WeakReference、PhantomReference
一,定义 在Java中,引用的定义是:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用.后面在JDK1.2开始,引用的概念被扩充,引用被分为强引用( ...
- android WeakReference(弱引用 防止内存泄漏)与SoftReference(软引用 实现缓存机制(cache))
在Android开发中,基本上很少有用到软引用或弱引用,这两个东东若用的很好,对自己开发的代码质量的提高有很大的帮助.若用的不好,会坑了自己.所以,在还没有真正的去了解它们之前,还是慎用比较好. 下面 ...
- Java中引用类 strong reference .SoftReference 、 WeakReference 和 PhantomReference的区别
当在 Java 2 平台中首次引入 java.lang.ref 包,其中包含 SoftReference . WeakReference 和 PhantomReference 三个引用类,引用类的 ...
- 软引用SoftReference异步加载图片
HashMap<String, SoftReference<Drawable>> imageCache 关于SoftReference这个类多少知道些机制,会用就ok了. 机制 ...
- Java引用总结--StrongReference、SoftReference、WeakReference、PhantomReference
Java引用总结--StrongReference.SoftReference.WeakReference.PhantomReference 1 Java引用介绍 Java从1.2版本开始引入了4种引 ...
- Android学习笔记之SoftReference软引用...
PS:其实这一篇和上一篇很类似,都是为了解决内存不足(OOM)这种情况的发生... 学习内容: 1.对象的引用类.... 最近也是通过项目中知道了一些东西,涉及到了对象的引用类,对象的引用类分为多 ...
- Java中的 WeakReference 和 SoftReference
我们知道Java语言中没有指针,取而代之的是引用reference.Java中的引用又可以分为四种:强引用,弱引用(WeakReference),软引用(SoftReference),虚引用(Phan ...
随机推荐
- android SoundPool播放音效
MediaPlayer的缺点: 资源占用量高,延时时间较长 不支持多个音效同一时候播放 SoundPool主要用于播放一些较短的声音片段,CPU资源占用率低和反应延时小,还支持自行色设置声音的品质,音 ...
- android 手电筒的实现
android手机用闪光灯做成手电筒的应用非常多,可是有的不能用. 后来发现是除了把 camera device的 flashmode设置成torch外还要打开预览: 以下是代码: MainActiv ...
- memcpy的用法总结
1.memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域):拷贝多少个?有一个size变量控制拷贝的字节数:函数原型:void *memcpy(voi ...
- USACO prefix TrieTree + DP
/* ID:kevin_s1 PROG:prefix LANG:C++ */ #include <iostream> #include <cstdio> #include &l ...
- USB相关知识
USB基础知识概论 如何实现Linux下的U盘(USB Mass Storage)驱动: How to WriteLinux USB MSC (Mass Storage Class) Driver U ...
- K.Bro Sorting
Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others)Total Submissio ...
- UVA 539 The Settlers of Catan dfs找最长链
题意:画边求最长链,边不能重复数点可以. 很水,用暴力的dfs即可,因为数据不大. 本来以为可以用floyd进行dp的,后来想想好像不能在有回路上的图跑...于是没去做. #include <c ...
- [Android]Log打印
package com.lurencun.android.system; import android.util.Log; public class ExLog { static final Stri ...
- Android 自学之核心服务
所谓Android的核心服务主要包括熵服务(Entropy Service).电源管理器(Power Manager).Activity管理器(Activity Manager).通话寄存器(Tele ...
- 搭建yum源服务器
在生产环境中,受到网络环境的影响,服务器可能带宽有限,连外网速度较慢或者局域网内的某些机器由于安全的限制,本身就不允许和外网和任何的连接.而这时候现在通过yum安装包或update包时就是一件比较麻烦 ...