Java學習筆記 (二十九) java中的四種引用

爲了更好的管理內存,有利於垃圾回收.
JDK1.2之後,Java對引用的概念進行了擴充,將引用分爲強引用(Strong Reference)、軟引用(Soft Reference)、弱引用(Weak Reference)、虛引用(Phantom Reference)四種。

強引用(Strong Reference)

如下:

  List list=new ArrayList();
  Map map=new HashMap();

以上都是強引用,只要強引用還存在,垃圾收集器永遠都不會回收被引用的對象,即使拋出OOM異常。

軟引用(Soft Reference)

軟引用可以用在那些有點用但是不是必須的對象上。
對於軟引用的被引用對象 來說,在內存不足即將OOM 之前會將對象回收。
可以使用SoftReference類來實現軟引用。

        SoftReference softReference=new SoftReference(new ArrayList<>());
        //回收之前會返回 對象的強引用
        softReference.get();
        //假設內存不足 該對象被回收 
        System.gc();
        //回收之後 返回null
        softReference.get();

弱引用(Weak Reference)

弱引用也是使用在那些不是必需的對象上的。但是它的強度要比軟引用弱一些,被弱引用關聯的對象只能生存到下一次垃圾回收前。
也就是當垃圾收集器工作時,無論當前內存是否足夠,對象都會被回收。
WeakReference 類可以來實現弱引用。

        WeakReference weakReference=new WeakReference(new ArrayList<>());
        //回收之前會返回 對象的強引用
        weakReference.get();
        System.gc();
        //回收之後 返回null
        weakReference.get();

虛引用(PhantomReference)

虛引用也稱爲幽靈引用或者幻影引用,它是最弱的一種引用關係。
一個對象是否有虛引用,完全不會對其生存時間構成影響。也無法通過虛引用得到一個對象的強引用。
虛引用需要和引用隊列一起使用,如果一個對象設置了虛引用,在對象被回收時,虛引用將會加入了引用隊列之中。
如下:

 public static void main(String []a)throws Exception{
        ReferenceQueue referenceQueue=new ReferenceQueue();
        PhantomReference phantomReference=new PhantomReference(new String("I Love LSM"), referenceQueue);
        Object obj= referenceQueue.poll();
        System.out.println("垃圾回收前:"+obj);
        System.gc();
        Thread.sleep(3000);
        Object object=referenceQueue.poll();
        System.out.println("垃圾回收後:"+object);

    }

注意: System.gc()調用只是通知虛擬機進行回收,垃圾收集器並不一定馬上會進行垃圾回收。

參考資料

學習摘抄於深入理解Java虛擬機

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章