强引用、软引用、弱引用、虚引用——4中引用的理解
1.强引用(Reference):默认使用的就是强引用,不会被GC,即使报OOM也不会被GC
Object o = new Object();//默认就是强引用,一般使用这种
2.软引用(SoftReference):当内存不够时,才能被GC回收,内存足够是不会被回收
3.弱引用(WeakReference):不管内存够不够,只要GC就会被回收,事例如下
public static void main(String[] args) { Object o = new Object(); WeakReference reference = new WeakReference(o); System.out.println(reference.get()); System.out.println("==================="); o = null;//给o赋值为空,目的是使上面new出来的Object对象除了弱引用以外没有其他引用 System.gc(); System.out.println(reference.get()); }
打印结果:
Connected to the target VM, address: '127.0.0.1:56868', transport: 'socket' java.lang.Object@35851384 =================== null Disconnected from the target VM, address: '127.0.0.1:56868', transport: 'socket'
可以看出,只要GC,弱引用类的对象就会被回收
弱引用中,可以牵扯出WeakHashMap,这个map的key具有弱的特性,只要GC,key就会被回收,对应的entry就会被移除
4.虚引用(PhantomReference):形同虚设,不管有没有GC,get()方法总是取不到值,一般要和引用队列(ReferenceQueue)连用,在GC时,系统会先将PhantomReference丢进队列里,监控对象回收情况(也只有这么点作用)
总结:软、弱引用一般用在内存作为缓存中,Mybatis缓存的底层就是用的软引用