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

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.虚引用

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