JVM引用框架:

**分类为:**
1. 强引用
2. 软引用
3. 虚引用
### 强引用(默认支持模式):
当内存不足,JVM开始垃圾回收,对于强引用的对象,即使OOM也不会对该对象进行回收,死都不收。
### 软引用:
1. 软引用是一种相对强引用弱化了一些引用,需要java.lang.ref.SoftReference类来实现,可以让对象豁免一些垃圾收。
1. 对于只有软引用的对于来说:
1. 当系统内存充足时,它不会被回收
2. 当系统内存不足 是,它会被回收
3. 软引用通常用于对敏感的程序中,比如高速缓存就有用到软引用,内存够用的时候就保留,不够用就回收。
### 弱引用:
1. 弱引用需要用java.lang.ref.WeakReference 类来实现,它比软引用的生成期更加短。
2. 对于只有弱引用对象来说,只要垃圾回收机制一运行,不管JVM的内存空间是否足够,都会回收对象占用的内存.
3. 比如:WeakHashMap
### 虚引用
1. 虚引用需要Java.lang.ref.PhantomReference类来实现顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期
2. 如果一个对象仅持有虚引用,那么它就没有任何引用一样,在任何时候都可能被垃圾回收器回收,它不能单独使用也不能通过它访问对象,虚引用必须和引用队列(ReferenceQueue)联合使用。
3. 虚引用的主要作用是跟踪对象被垃圾回收的状态,仅仅是提供了一种确保对象finalize以后。做某些事情的机制,phantomReference的get方法总是返回null,因此无法访问对象的引用对象,其意义在于说明一个对象进入finaliztion阶段,可以被gc回收,用来实现比finalization机制更灵活的回收操作。
4. 换句话说,设置虚引用关联的唯一目的,就是这个对象被收集器回收的时候收到一个系统通知或者后续添加进一步的处理,java技术允许使用finalize方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
5. 软弱引用的的使用场景,**mybatis 的缓存就有大量的使用的弱引用**来实现缓存
### 应用场景
假如有一个应用需要读取大量的本地图片:
* 如果每次读取图片都要从硬盘中读取则会严重影响性能。
* 如果一次性全部加载到内存又可能会造成内存溢出。
此时使用软引用可以解决这个问题。
**设计思路:**
* 用一个HashMap来保持图片的路径和相对应的图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所有占用的空间,从而有效的避免了OOM的问题
Exmaple:
```java
Map<String,SoftReference<Bitmap>> imageCache = new HashMap<String,SoftReference<Bitmap>>();
```
JVM之对象引用,窥见缓存技术的核心原理。