Java reference

J_W發表於2018-12-07

三種 reference類

在jvm中,如果有引用指向該物件,則該物件是可獲得的(reachable),意味著你在棧中有一個普通的引用指向該物件。GC無法回收這種物件。如果你想使用一個物件,同時希望在記憶體不夠時候,gc可以回收該物件。解決方案就是引用物件,java.lang.ref:

  • WeakReference(實現規範對映,只要gc就開始回收。有WeakHashMap的應用)
        Person p1=new Person();
        //1.建立可選的佇列,可以在gc回收該物件後,放到該佇列。
        ReferenceQueue<Person> refQueue = new ReferenceQueue<Person>();
        //2.建立WeakReference物件,引數實際物件+佇列
        WeakReference wr=new WeakReference(p1,refQueue);
        //獲取物件的方式,
        System.out.println(wr.get());
        System.out.println(refQueue.poll());
        p1=null;
        //gc之後物件被回收了,進入到了佇列了。
        System.gc();
        System.out.println("after gc()");
        System.out.println(wr.get());
        System.out.println(refQueue.poll());
        
        執行結果:
        thinkinginstring.Person@6e0be858
        null
        after gc()
        null
        java.lang.ref.WeakReference@61bbe9ba
複製程式碼
  • PhantomReference(用以排程回收前的清理工作,比finalize更靈活)
        Person p1=new Person();
        ReferenceQueue<Person> refQueue = new ReferenceQueue<Person>();
        PhantomReference pr=new PhantomReference(p1,refQueue);
        System.out.println(pr.get());
        System.out.println(refQueue.poll());
        p1=null;
        System.gc();
        System.out.println(pr.get());
        System.out.println(refQueue.poll());
        
        執行結果:
        null
        null
        null
        java.lang.ref.PhantomReference@6e0be858
複製程式碼

Once the garbage collector decides that an object obj is phantom-reachable, it is being enqueued on the corresponding queue, but its referent is not cleared. That is, the reference queue of the phantom reference must explicitly be processed by some application code. 一旦GC決定一個“obj”是虛可達的,它(指PhantomReference)將會被入隊到對應的佇列,但是它的指代並沒有被清除。也就是說,虛引用的引用佇列一定要明確地被一些應用程式程式碼所處理。

  • SoftReference(記憶體不足時才開始回收,記憶體敏感的快取記憶體)

相關文章