SoftReference 软引用使用实例
2017-01-13 11:28
162 查看
1.今天来教大家使用下java缓存神奇SoftReference类,具体概念见别的博客,我们直接上代码:
今天就到这里,谢谢大家!
老生常谈:深圳有爱好音乐的会打鼓(吉他,键盘,贝斯等)的程序员和其它职业可以一起交流加入我们乐队一起嗨。我的QQ:657455400
//要缓存的对象 public class Obj { /**缓存标识*/ private String id ; /**这里只是举个例子,以便后面实验能看到内存回收的效果*/ private byte[] a = new byte[1024 * 1024*500]; public Obj(String id) { this.id = id; } public String getId() { return this.id; } } //下面见下 缓存 单利类 public enum ObjCache { cache ; private Hashtable<String, SoftReference<Obj>> objRefs = null; /*** * 这个存 的是 : 被标记回收的 SoftReference 对象。 */ private ReferenceQueue<Obj> refQue = null; private ObjCache() { this.objRefs = new Hashtable<String, SoftReference<Obj>>(); this.refQue = new ReferenceQueue<Obj>(); } // 取得缓存器实例 public static ObjCache getInstance() { return cache; } public Obj getObj(String id) { Obj em = null; // 有缓存 直接 取出 , 但是也可能为 null if (objRefs.containsKey(id)) { em = objRefs.get(id).get(); } if (em == null) { em = new Obj(id); // 重新构造, // 加入缓存 cacheObj(em); } return em; } // 添加到缓存 private void cacheObj(Obj em) { SoftReference<Obj> ref = new SoftReference<Obj>(em, this.refQue); this.objRefs.put(em.getId(), ref); System.out.println("缓存成功。"); } // 测试 内存现在到底缓存多少个 obj 对象 public void print(){ System.out.println("现在内存中缓存 Obj对象 的情况"); for(String s : objRefs.keySet()){ if(objRefs.get(s).get() == null){//这里如果内存不够,会自动回收存入的obj对象,所以取出来可能为 null System.out.println("===: null 这个是被虚拟机自动回收了"); }else{ System.out.println("===: "+objRefs.get(s).get()); } } } // 测试 public static void main(String[] args) throws Exception { // 下面的a变量只为消耗一部分内存空间,占用了4M // 因为对于软可及对象,只有在系统内存不足时才会被回收,所以必须占用掉大部分内存 ObjCache cache = ObjCache.getInstance(); for(int i=0;i<100;i++){ Thread.sleep(1000); System.out.println(cache.getObj("zhangsan"+i)); ObjCache.cache.print(); } } } //测试结果 : 没有崩溃!说明我们的软引用起作用了。 缓存成功。 test.soft.Obj@4eb09321 现在内存中缓存 Obj对象 的情况 ===: test.soft.Obj@4eb09321 缓存成功。 test.soft.Obj@2a8b83e3 现在内存中缓存 Obj对象 的情况 ===: test.soft.Obj@2a8b83e3 ===: test.soft.Obj@4eb09321 缓存成功。 test.soft.Obj@4f19c297 现在内存中缓存 Obj对象 的情况 ===: null 这个是被虚拟机自动回收了 ===: null 这个是被虚拟机自动回收了 ===: test.soft.Obj@4f19c297 缓存成功。 test.soft.Obj@71f801f7 现在内存中缓存 Obj对象 的情况 ===: null 这个是被虚拟机自动回收了 ===: null 这个是被虚拟机自动回收了 ===: test.soft.Obj@71f801f7 ===: test.soft.Obj@4f19c297 缓存成功。
今天就到这里,谢谢大家!
老生常谈:深圳有爱好音乐的会打鼓(吉他,键盘,贝斯等)的程序员和其它职业可以一起交流加入我们乐队一起嗨。我的QQ:657455400
相关文章推荐
- C# System.NullReferenceException: 未将对象引用设置到对象的实例
- Java之引用类型分析(SoftReference/WeakReference/PhantomReference)
- (引用)使用 C# 和 C++.NET 开发的 .NET 应用程序实例列表
- 【C#】错误“System.NullReferenceException:未将对象引用设置到对象的实例“解析
- PHP引用(&)各种使用方法实例详解【讲的很全面】
- &(取引用 reference)和*(解引用 dereference)在二维数组时候的使用
- ashx中使用HttpContext.Current.Session ,出现未将对象引用设置到实例上[转]
- Java调用webservice出现System.NullReferenceException: 未将对象引用设置到对象的实例。
- Android学习笔记之SoftReference软引用...
- 弱引用(weakReference)和softRef…
- 未将对象引用设置到对象的实例。未处理NullReferenceException
- GridView中使用类似于Button btnToped = (Button)e.Row.FindControl("btnToped");提示“未将对象引用到实例”,也就是找不到控件的问题的解决方法
- Java之WeakReference与SoftReference使用讲解
- JSON使用ReferenceLoopHandling忽略其引用循环值
- Java引用对象SoftReference WeakReference PhantomReference
- Java中三个引用类SoftReference 、 WeakReference 和 PhantomReference的区别
- vs 新建项目 未将对象引用设置到实例(Object reference is not set to an object)
- Java引用对象SoftReference、WeakReference简单介绍
- java弱引用(WeakReference)和SoftReference的区别以及在android内存处理的作用
- WINFORM 使用datagridview取值时出现"未将对象引用设置到对象的实例"