首页 > 编程知识 正文

软引用和弱引用的区别,双引用内的引号使用

时间:2023-05-05 00:00:48 阅读:212102 作者:2576

1 弱引用 (WeakReference)

弱引用对象,这些对象不会阻止对其引用对象进行终结,终结和回收。弱引用最常用于实现规范化映射。假设垃圾收集器在某个时间点确定对象是弱可到达的。到那时,它将自动清除对该对象的所有弱引用以及对所有其他弱可达对象的弱引用,这些对象都可以通过一系列强引用和软引用从该对象到达。同时,它将声明所有以前弱可及的对象都是可终结的。同时或稍后,它将把那些新近清除的弱引用加入队列,这些弱引用已在引用队列中注册

简单的理解就是:弱引用用来描述非必须对象的,当gc进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。

1.1 下面以定义一个String 对象来说下弱引用 (WeakReference)的使用

WeakReference<String> str = new WeakReference<>("弱引用"); Log.e("---------str", str.get());

1.2 加载一个图片的demo

先看下普通的使用

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.image); Drawable drawable = new BitmapDrawable(bitmap); imageView.setBackground(drawable);

如果使用弱引用 (WeakReference)如下

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.image); Drawable drawable = new BitmapDrawable(bitmap); WeakReference<Drawable> weakDrawable = new WeakReference<>(drawable); Drawable bgdrawable = weakDrawable.get(); if(bgdrawable != null) { imageView.setBackground(drawable); }

扩展下引用,引用有4中强引用、软引用、弱引用、虚引用

2 强引用:

String st = new String("强引用");

如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题

3 软引用(SoftReference)

下面是官方的说法:

软引用对象,垃圾回收器会根据内存需求酌情清除这些对象。

假设垃圾收集器在某个时间点确定可以轻柔地到达对象。那时,它可以选择原子地清除对该对象的所有软引用,以及对所有其他软可访问对象的所有软引用,这些对象都可以通过一系列强引用从该对象到达该对象。同时或在以后的某个时间,它将排队那些已在引用队列中注册的新清除的软引用。

确保在虚拟机抛出之前清除了对所有可软访问对象的软引用 OutOfMemoryError。否则,在清除软引用的时间或清除对不同对象的一组此类引用的时间上将没有任何限制。但是,鼓励虚拟机实现偏向于清除最近创建或最近使用的软引用。

避免使用软引用进行缓存

实际上,软引用在缓存方面效率低下。运行时没有足够的信息来清除和保留哪些引用。最致命的是,在清除软引用和增大堆之间进行选择时,它不知道该怎么办。

缺少有关每个参考的应用价值的信息,限制了软参考的实用性。过早清除引用会导致不必要的工作;那些清除得太晚会浪费内存。

大多数应用程序应使用android.util.LruCache而不是软引用。LruCache具有有效的逐出策略,并允许用户调整分配的内存量。

软引用的使用和弱引用差不多

SoftReference<String> str = new SoftReference<>("软引用"); Log.e("---------str", str.get());

4 虚引用(PhantomReference)

虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

 

参考文章:https://www.jianshu.com/p/8488079a939b

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。