1)引用的整体组织架构
2)引用类型
强引用:对于强引用对象,即使出现OOM也不会进行回收;
软引用:内存够用就保存,不够用就回收;
弱引用:无论内存是否够用,都回收(WeakHashMap);
虚引用:不能单独使用也不能通过它访问对象,虚引用必须与引用队列(ReferenceQueue)联合使用,其意义在于说明一个对象已经进入finalization阶段,可以被gc回收,用来实现比finalization机制更灵活的回收操作;
引用队列:创建引用的时候可以指定关联的队列,当GC释放对象内存的时候,会将引用加入到引用队列ReferenceQueue;
java提供了4种引用类型,在垃圾回收的时候,都有各自的特点。
- ReferenceQueue是用来配合引用工作的,没有ReferenceQueue一样可以运行。
- 创建引用的时候可以指定关联的队列,当GC释放对象内存的时候,会将引用加入到引用队列,如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动这相当于是一种通知机制。
- 当关联的引用队列中有数据的时候,意味着引用指向的堆内存中的对象被回收。通过这种方式,JVM允许我们在对象被销毁后,做一些我们自己想做的事情。
3)各类引用的使用场景
情景:假如有一个应用需要读取大量的本地图片:
- 如果每次读取图片都从硬盘读取则会严重影响性能;
- 如果一次性全部加载到内存中又可能造成内存溢出;
解决方案:
- 此时使用软引用可以解决这个问题
设计思路:
用一个HashMap来保存图片的路径和相应图片对象的关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题。
Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();
4)四种引用的图示