爲了更好的管理內存,有利於垃圾回收.
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虛擬機