软引用

【Java:对象的强、软、弱和虚引用】Java对象的强、软、弱和虚引用的概念、应用。

本秂侑毒 提交于 2020-03-09 19:37:37
http://zhangjunhd.blog.51cto.com/113473/53092 1.对象的强、软、弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。图1为对象应用类层次。 图1 ⑴强引用(StrongReference) 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。 ⑵软引用(SoftReference) 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存(下文给出示例)。 软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。 ⑶弱引用(WeakReference)

细节决定成败----Android应用程序的优化(二)

房东的猫 提交于 2020-03-02 06:08:16
本文章主要从软引用和弱引用的角度探讨Bitmap的内存优化。 Java从JDK1.2之后就将对象的引用分为4个级别:强引用、软引用、弱引用、虚引用。具体的概念不详述了。 软引用:当内存空间足够的时候,GC就不会回收它,内存空间不足了,就会回收。 弱引用:GC工作过程中,一旦发现了弱引用对象,不管内存足够与否,都会回收它的内存。 所以,从上述可以看出,软引用和弱引用的根本区别在于:只具有弱引用的对象拥有更短暂的生命周期,可能随时被回收。 当缓存大量的Bitmap时,比较容易造成OOM,所以可以考虑使用软引用技术来避免这个问题的发生。 //首先定义一个HashMap,保存软引用对象 private Map<string, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>(); //保存Bitmap的软引用到HashMap public void addBitmapToCache(String path) { //强引用的Bitmap对象 Bitmap bitmap = BitmapFactory.decodeFile(path); //软引用的Bitmap对象 SoftReference<Bitmap> softBitmap = new SoftReference<Bitmap>

android-------- 强引用、软引用、弱引用、虚引用使用

梦想的初衷 提交于 2019-12-02 18:21:23
在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引用了。 从Java SE2开始,就提供了四种类型的引用:强引用、软引用、弱引用和虚引用。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决定某些对象的生命周期;第二是有利于JVM进行垃圾回收。下面来阐述一下这四种类型引用的概念: 引用分为四个,从高到低的级别以此为 强引用 - 软引用 - 弱引用 - 虚引用 . 引用类型 类别 回收机制 用途 生存时间 强引用 从不回收 对象状态 JVM停止运行时 软引用 内存不足时进行回收 缓存 内存不足 弱引用 对象不被引用时回收 缓存 GC运行后 虚引用 对象被回收时 管理控制精确内存稳定性 unknown 强引用(Strong Reference) 永不回收。 强引用就是在程序代码之中普遍存在的,类似 Object obj = new Object() 这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。 弱引用(Soft Reference) 重点回收对象。 弱引用也是用来描述非必需对象的,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。 软引用(Weak Reference)