1、软引用
如果一个对象只有软引用关联到它,当程序内存不足时,就会将软引用中的数据进行回收。
在JDK 1.2版之后提供了SoftReference类来实现软引用,软引用常用于缓存中。
软引用的执行过程如下
1.将对象使用软引用包装起来,new SoftReference<对象类型>(对象)
2.内存不足时,虚拟机尝试进行垃圾回收。
3.如果垃圾回收仍不能解决内存不足的问题,回收软引用中的对象。
4.如果依然内存不足,抛出OutOfMemory异常。
1 | public static void main(String[] args) throws IOException { |
此时有个问题 既然软引用被回收了 那留着SoftReference对象也没用了 浪费资源
软引用中的对象如果在内存不足时回收,SoftReference对象本身也需要被回收。如何知道哪些SoftReference对象需要回收呢?
SoftReference提供了一套队列机制:
1、软引用创建时,通过构造器传入引用队列
2、在软引用中包含的对象被回收时,该软引用对象会被放入引用队列
3、通过代码遍历引用队列,将SoftReference的强引用删除

2、弱引用
弱引用的整体机制和软引用基本一致,区别在于弱引用包含的对象在垃圾回收时,不管内存够不够都会直接被回收。
在JDK1.2版之后提供了WeakReference类来实现弱引用,弱引用主要在ThreadLocal中使用。
弱引用对象本身也可以使用引用队列进行回收。
3、虚引用和终结器引用
这两种引用在常规开发中是不会使用的,
虚引用也叫幽灵引用/幻影引用,不能通过虚引用对象获取到包含的对象.
虚引用唯一的用途是当对象被垃圾回收器回收时可以接收到对应的通知.
JAVA中使用PhantomReference实现了虚引用,
直接内存中为了及时知道直接内存对象不再使用,从而回收内存,使用了虚引用来实现.
终结器引用指的是在对象需要被回收时,终结器引用会关联对象并放置在终结器类中的引用队列中,
在稍后由一条由终结器线程线程从队列中获取对象,然后执行对象的终结器方法,
在对象第二次被回收时,该对象才真正的被回收.在这个过程中可以在最终确定方法中再将自身对象使用强引用关联上,但是不建议这样做。