内存优化:SoftReference 和 WeakReference 软引用与弱引用
来源:互联网 发布:学德语的软件 编辑:程序博客网 时间:2024/05/24 06:54
java.lang.ref.SoftReference
SoftReference 在“弱引用”中属于最强的引用。SoftReference 所指向的对象,当没有强引用指向它时,会在内存中停留一段的时间,垃圾回收器会根据 JVM 内存的使用情况(内存的紧缺程度)以及 SoftReference 的 get() 方法的调用情况来决定是否对其进行回收。
具体使用一般是通过 SoftReference 的构造方法,将需要用弱引用来指向的对象包装起来。当需要使用的时候,调用 SoftReference 的 get() 方法来获取。当对象未被回收时 SoftReference 的 get() 方法会返回该对象的强引用。如下:
SoftReference<Bean> bean = new SoftReference<Bean>(new Bean("name", 10)); System.out.println(bean.get());// “name:10“软引用有以下特征:
软引用使用 get() 方法取得对象的强引用从而访问目标对象。
软引用所指向的对象按照 JVM 的使用情况(Heap 内存是否临近阈值)来决定是否回收。
软引用可以避免 Heap 内存不足所导致的异常。
当垃圾回收器决定对其回收时,会先清空它的 SoftReference,也就是说 SoftReference 的 get() 方法将会返回 null,然后再调用对象的 finalize() 方法,并在下一轮 GC 中对其真正进行回收。
java.lang.ref.WeakReference
WeakReference 是弱于 SoftReference 的引用类型。弱引用的特性和基本与软引用相似,区别就在于弱引用所指向的对象只要进行系统垃圾回收,不管内存使用情况如何,永远对其进行回收(get() 方法返回 null)。
完全可以通过和 SoftReference 一样的方式来操作 WeakReference,这里就不再复述。
弱引用有以下特征:
弱引用使用 get() 方法取得对象的强引用从而访问目标对象。
一旦系统内存回收,无论内存是否紧张,弱引用指向的对象都会被回收。
弱引用也可以避免 Heap 内存不足所导致的异常。
总结:
引用类型===取得目标对象方式===垃圾回收条件===是否可能内存泄漏
强引用 直接调用 不回收 不可能
软引用 通过 get() 方法 视内存情况回收 不可能
弱引用 通过 get() 方法 永远回收 不可能
调用方法:
A obj = new A();
WeakReference wr = new WeakReference(obj);
obj = null;
//等待一段时间,obj对象就会被垃圾回收
...
if (wr.get()==null) {
System.out.println("obj 已经被清除了 ");
} else {
System.out.println("obj 尚未被清除,其信息是 "+obj.toString());
}
==============================================================
A obj = new A();
SoftRefenrence sr = new SoftReference(obj);
引用时
if(sr!=null){
obj = sr.get();
}else{
obj = new A();
sr = new SoftReference(obj);
}
- 内存优化:SoftReference 和 WeakReference 软引用与弱引用
- Android内存管理 强引用HardReference、弱引用WeakReference、软引用SoftReference和虚引用PhantomReference
- JAVA中的强引用、软引用(SoftReference)、弱引用(WeakReference)和幽灵引用(PhantomReference)
- java中虚引用PhantomReference与弱引用WeakReference(软引用SoftReference)的差别
- 弱引用和软引用WeakReference,SoftReference,最简讲解,以及一个应用场景
- java弱引用(WeakReference)和SoftReference的区别以及在android内存处理的作用
- java弱引用(WeakReference)和SoftReference的区别以及在android内存处理的作用
- java弱引用(WeakReference)和SoftReference的区别以及在android内存处理的作用
- java弱引用(WeakReference)和SoftReference的区别以及在android内存处理的作用
- java弱引用(WeakReference)和SoftReference的区别以及在android内存处理的作用
- java弱引用(WeakReference)和SoftReference的区别以及在android内存处理的作用
- java弱引用(WeakReference)和SoftReference的区别以及在android内存处理的作用
- java弱引用(WeakReference)和SoftReference的区别以及在android内存处理的作用
- Android 内存溢出解决方案(OOM) 整理总结 (软引用(SoftReference)、虚引用(PhantomRefrence)、弱引用(WeakReference),)
- Java的引用WeakReference与SoftReference
- java弱引用(WeakReference)和SoftReference的区别
- Java引用之WeakReference和SoftReference
- 强引用(New)、软引用(SoftReference )、弱引用(WeakReference )、虚引用(PhantomReference)
- send 和 WSASend性能比较
- [CSS]HTML前端设计中的布局问题
- 最长递减子序列[转载]
- 关于优化内存 提高软件运行效率的 写的真的很不错
- Spring JdbcTemplate小结
- 内存优化:SoftReference 和 WeakReference 软引用与弱引用
- 5款主流NoSQL数据库全方位横评
- 使用意图在Activity之间传递数据小插曲__传递对象
- spring 集成的项目,Properties配置文件外移
- 20人年的项目2个星期交接,你从哪里入手?
- java基础--->基本数据类型之间的转换
- 代码中配置log4j 参数
- Chromium for android 1 源码获取
- Spring MVC 学习笔记 json格式的输入和输出