强引用
在Java中使用如下方式声明的引用是强引用
String str = new String("abc");
str 是堆中对象new String("abc")的强引用,被强引用的对象在任何时候gc不会被回收,即使内存不足汇报OOM。
软引用
在Java中使用如下方式声明的引用是软引用
SoftReference<Car> b = new SoftReference<>(new Car("bcd", 1));
软引用对象在内存不足gc时会被回收
弱引用
在Java中使用如下方式声明的引用是弱引用
WeakReference<Car> a = new WeakReference<>(new Car("abc", 1));
System.out.println(a.get());
System.gc();
System.out.println(a.get());
a是堆中对象new Car("abc", 1)的弱引用,弱引用在gc时会被回收。上面的代码输出:
如果一个对象既被强引用又被弱引用,那么就按强引用来
虚引用
在Java中使用如下方式声明的引用是虚引用
String str = new String("abc"); ReferenceQueue queue = new ReferenceQueue(); PhantomReference pr = new PhantomReference(str, queue); System.out.println(pr.isEnqueued()); str = null;//切断引用 System.gc();//回收 while (true){ boolean flag=pr.isEnqueued(); if(flag){ System.out.println("已被回收"); break; }else { System.out.println("未被回收"); } }
虚引用每次get的时候都是null,虚引用不破坏原来对象的生命周期如同空气,使用方法需要配合ReferenceQueue使用。对象在被gc后,引用对象被加入到ReferenceQueue。可以使用虚引用来判断对象是否被回收。