强引用
默认的引用,任何对象被赋值即为强引用;
强引用不会被GC回收。
public class StrongReferenceUsage {
@Test
public void stringReference(){
Object obj = new Object();
}
}
软引用
只有在内存不足时,软引用才会被GC回收。
@Test
public void softReference(){
Object obj = new Object();
SoftReference<Object> soft = new SoftReference<>(obj);
obj = null;
log.info("{}",soft.get());
System.gc();
log.info("{}",soft.get());
}
弱引用
只要进行GC,弱引用就会被回收。
@Test
public void weakReference() throws InterruptedException {
Object obj = new Object();
WeakReference<Object> weak = new WeakReference<>(obj);
obj = null;
log.info("{}",weak.get());
System.gc();
log.info("{}",weak.get());
}
虚引用
虚引用对象没有被任何的效果,进行GC即被回收;
作用仅仅是被回收后放入引用队列,标识该对象已被回收。
例如:加载一张大内存图片,确认被回收后才读取下一张,防止OOM。