# 引用级别

意义:用来标记对角是否可以被回收
级别:
强 > 软 > 弱 > 虚

# 1. 强引用

即一般普通的引用。
如果一个对象是强引用,绝对不会被回收,即使内存空间不足也不会被回收,而是抛 OutOfMemoryError 异常使程序终止。

1
2
3
String str = "abc";
List<String> list = new Arraylist<String>();
list.add(str);

在 list 集合里的数据不会释放,即使内存不足也不会

1
Object obj = new Object();  

// 可直接通过 obj 取得对应的对象 如 obj.equels (new Object ());
而这样 obj 对象对后面 new Object 的一个强引用,只有当 obj 这个引用被释放之后,对象才会被释放掉,这是经常用到的编码形式。

# 2. 软引用

非必须引用,如果空间不足就会被 GC 回收。换句话说,在内存溢出之前进行回收。
只要没有被回收,该对象就可能被程序使用。软引用可用来实现内存敏感的高速缓存。
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,JAVA 虚拟机就会把这个软引用加入到与之关联的引用队列中。

1
2
3
4
5
6
7
public void testSofeReference() {
Object obj= new Object();
SoftReference<Object> softReference = new SoftReference<Object>(obj);
obj = null;
System.out.println(softReference.get()); //有时候会返回 null
System.out.println(softReference.isEnqueued()); //返回时否被 GC 回收的标记
}

这时候 softReference 是对 obj 的一个软引用,通过 sf.get () 方法可以取到这个对象,当然,当这个对象被标记为需要回收的对象时,则返回 null;
软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据。

# 3. 弱引用

第二次圾垃回收时,被回收

# 4. 虚引用

垃圾回收时回收,无法通过引用取到对象值