四种引用方式

    技术2022-07-12  58

    四种引用简介:

    强引用:

    平常最常见也是我们用的最多的一种引用方式:强引用,作为生命力最强的引用,只要引用还存在着,垃圾收集器(GC)就不会将该引用给回收,即使会出现内存溢出。就是说这种引用只要引用还一直指向的对象,GC是不会去管它的,所以叫它强引用。不过在这种情况下:

    Container c1 = new Container(100); c1=null;

    c1被赋了空值,该引用就断了,垃圾收集器(GC)会在合适的时候回收改引用的内存。还有一种情况就是c1是成员变量,方法执行完了,c1随着被栈帧被回收了,c1引用也是一起被回收了。

    软引用

    软引用是用来描述一些有用但是非必须的引用对象,在内存充足的情况下它不会被GC,但是在内存不足时可能会被GC,软引用与缓存类似,在内存充足的情况下,会一直缓存缓存,但当内存不足时则需要重新创建对象或者访问原对象。

    SoftReference<Container> c2=new SoftReference<Container>(new Container(20)); System.out.println(c2.get());//通过软引用获取和操作对象

    软引用通过SoftReference关键字将对象放入到构造函数中,再使用对应的方法调用get()来调用具体的对象

    存在一种方法可以将软引用转换为强引用,代码如下:

    Container c3=c2.get(); 这种方法可以将软引用转换为强引用,但是不推荐使用,了解即可。

    弱引用

    相比于强引用与软引用,弱引用存活的周期会更短,只要GC执行了,那么被弱引用关联的对象就可能会被回收。弱引用的存活周期可以理解为:从创建到下一次GC。代码实现如下:

    class Container{ private Object [] arrary; public Container(int cap) { this.arrary=new Container[cap]; } @Override protected void finalize() throws Throwable { System.out.println("你是我爷爷"); } } public class TestGC03 { public static void main(String[] args) { WeakReference<Container> c4=new WeakReference<Container>(new Container(20)); System.out.println(c4.get()); Container c1 = new Container(100); //清除强引用, 触发GC c1=null; System.gc();

    当强引用被清除,手动触发GC后,弱引用回收,被加入到队列中了。

    虚引用

    虚引用是最弱的一种引用,它不会影响对象的生命周期,对象被回收跟它没啥关系。它引用的对象可以在任何时候被回收,而且也无法根据虚引用来取得一个对象的实例。仅仅当它指向的对象被回收的时候,它会受到一个通知。用的最少,类似没有引用,主要用于记录对象的销毁,和记录日志。

    public static void main(String[] args) throws Exception { Object abc = new Object(); ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>(); PhantomReference<Object> abcRef = new PhantomReference<Object>(abc, refQueue); System.out.println("队列中的东西:" + refQueue.poll()); abc = null; System.gc(); Thread.sleep(1000); System.out.println("引用加入队列了吗? " + abcRef.isEnqueued()); System.out.println("队列中的东西:" + refQueue.poll()); /** * 输出: * 队列中的东西:null * 引用加入队列了吗? true * 队列中的东西:java.lang.ref.PhantomReference@7bb11784 */ }

    发现队列中有引用了,就可以进行记录日志了。

    总结

    强引用>软引用>弱引用>虚引用

    强引用:此引用引用的对象,生命力最强。(对象不会被GC) 软引用:此引用引用的对象,在内存不足时可能会被GC。 弱引用:此引用引用的对象,在GC执行时可能直接会被销毁 虚引用:用的最少,类似没有引用,主要用于记录对象的销毁。

    Processed: 0.017, SQL: 9