强引用、软引用、弱引用、虚引用——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缓存的底层就是用的软引用

posted @ 2021-01-01 17:34  发奋推墙  阅读(179)  评论(0编辑  收藏  举报