天天看點

java各種引用

Java中有四種類型的引用

強引用(String reference)

弱引用(Weak reference)

軟引用(Soft reference)

虛引用(Phantom reference)

1.強引用

是程式設計中使用的最簡單的引用,如代碼String s = "abc" 中,變量s就是字元串對象“abc”的一個強引用。任何被強引用指向的對象都不能被垃圾回收器 回收,

這些對象是在程式中需要的。

2.弱引用

使用java.lang.ref.WeakReference class 類來表示,可以使用下面的代碼建立弱引用:

Counter counter = new Counter(); // strong reference - line 1
WeakReference<Counter> weakCounter = new WeakReference<Counter>(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection           

現在隻要你給強引用對象counter賦空值null,該對象就可以被垃圾回收器回收。因為該對象此時不再含有其他強引用

如果一個對象隻有弱引用指向它,垃圾回收器會立即回收該對象,這是一種急切回收方式。

另一個使用弱引用的例子是WeakHashMap,它是除HashMap和TreeMap之外,Map接口的另一種實作。WeakHashMap有一個特點:map中的鍵值(keys)都被封裝成弱引用,也就是說一旦強引用被删除,WeakHashMap内部的弱引用就無法阻止該對象被垃圾回收器回收。

3.軟引用

如果該對象含有軟引用,Counter對象不會立即被回收,除非JVM需要記憶體。Java中的軟引用使用java.lang.ref.SoftReference類來表示

Counter prime = new Counter(); // prime holds a strong reference – line 2
SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object created at line 2
prime = null; // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory           

軟引用可是很好的實作JVM緩存

4.虛引用

使用java.lang.ref.PhantomReference類來表示。擁有虛引用的對象可以在任何時候被垃圾回收器回收。和弱引用和軟引用相似,你可以通過如下代碼建立虛引用:

ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference<DigitalCounter> phantom = new PhantomReference<DigitalCounter>(digit, refQueue);           

一個對象的生命周期可以通過下圖進行描述:

java各種引用
下一篇: hermit