目录
可达性算法中描述的对象引用,一般指的是强引用,即是GCRoot对象对普通对象有引用关系,只要这层关系存在,
普通对象就不会被回收。除了强引用之外,Java中还设计了几种其他引用方式:
⚫ 软引用
⚫ 弱引用
⚫ 虚引用
⚫ 终结器引用
1. 软引用
软引用相对于强引用是一种比较弱的引用关系,如果一个对象只有软引用关联到它,当程序内存不足时,就会将软引用中的数据进行回收。
在JDK 1.2版之后提供了SoftReference类来实现软引用,软引用常用于缓存中
软引用的执行过程如下:
- 1.将对象使用软引用包装起来,new SoftReference<对象类型>(对象)。
- 2.内存不足时,虚拟机尝试进行垃圾回收。
- 3.如果垃圾回收仍不能解决内存不足的问题,回收软引用中的对象。
- 4.如果依然内存不足,抛出OutOfMemory异常
软引用中的对象如果在内存不足时回收,SoftReference对象本身也需要被回收。如何知道哪些SoftReference对象需要回收呢?
SoftReference提供了一套队列机制: - 1、软引用创建时,通过构造器传入引用队列
- 2、在软引用中包含的对象被回收时,该软引用对象会被放入引用队列
- 3、通过代码遍历引用队列,将SoftReference的强引用删除
软引用的使用场景-缓存
软引用也可以使用继承自SoftReference类的方式来实现,StudentRef类就是一个软引用对象。通过构造器传入软引用包含的对象,以及引用队列。
使用软引用实现学生数据的缓存:
软引用如果被回收,要清理HashMap中的key。
2.弱引用
弱引用的整体机制和软引用基本一致,区别在于弱引用包含的对象在垃圾回收时,不管内存够不够都会直接被回收。在JDK 1.2版之后提供WeakReference类来实现弱引用,弱引用主要在ThreadLocal中使用。
弱引用对象本身也可以使用引用队列进行回收。