引用级别 意义:用来标记对角是否可以被回收 级别: 强 > 软 > 弱 > 虚
1.强引用
即一般普通的引用。 如果一个对象是强引用,绝对不会被回收,即使内存空间不足也不会被回收,而是抛 OutOfMemoryError 异常使程序终止。 例1:
代码语言:javascript复制String str = "abc";
List<String> list = new Arraylist<String>();
list.add(str);
在list集合里的数据不会释放,即使内存不足也不会
例2:
代码语言:javascript复制Object obj = new Object();
//可直接通过obj取得对应的对象 如obj.equels(new Object()); 而这样 obj对象对后面new Object的一个强引用,只有当obj这个引用被释放之后,对象才会被释放掉,这是经常用到的编码形式。
2.软引用
非必须引用,如果空间不足就会被GC回收。换句话说,在内存溢出之前进行回收。 只要没有被回收,该对象就可能被程序使用。软引用可用来实现内存敏感的高速缓存。 软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,JAVA虚拟机就会把这个软引用加入到与之关联的引用队列中。
代码语言:javascript复制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.虚引用
垃圾回收时回收,无法通过引用取到对象值