强引用:不会被回收
软引用:当内存充足时不回收,当内存不够时回收
弱引用:回收
case:
public static void main(String[] args) {
Object obj = new Object();
WeakReference<Object> weakReference = new WeakReference<>(obj);
SoftReference<Object> softReference = new SoftReference<>(obj);
System.out.println(obj);
System.out.println(weakReference.get());
System.out.println(softReference.get());
obj = null;
System.gc();
// try {
// Byte[] bytes = new Byte[10 * 1024 * 1024];
//
// } catch (Throwable e) {
// e.printStackTrace();
// }
System.out.println(obj);
System.out.println(weakReference.get());
System.out.println(softReference.get());
}
实际执行case的时候我发现跟介绍的不同,弱引用并没有被System.gc()回收,只有触发OOM了弱引用才会和软引用一样被回收。后来发现跟软引用有关,把软引用去掉就被回收了。
虚拟引用