Java 對象的引用方式有如下四種,這四種方式主要是為了給垃圾回收提供更靈活的操作:
1、強引用,最常見的引用方式,當一個對象被一個或一個以上的引用變量引用時,它處於可達狀態,這時不會被垃圾回收器回收。
2、軟引用(SoftReference),通常用於內存敏感的程序中,當一個對象只有軟引用時,當系統空間足夠時,系統不會回收它,當系統空間不夠時,系統可能回收它。
3、弱引用(WeakReference),不管系統空間是否足夠,總會回收該對像所占用的內存。
4、虛引用(PhangtomReference),類似與完全沒有引用,虛引用主要用於跟蹤對象被垃圾回收的狀態,它不能單獨使用,必須和引用隊列(ReferenceQueue)一起使用,當該引用的對象被垃圾回收之後,虛引用將進入引用隊列中,虛引用不能通過get方法,獲取正常的引用。
示例如下:
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
public class PhantomReferenceTest {
public static void main(String[] args) {
String str = new String("Hello World");
ReferenceQueue referenceQueue = new ReferenceQueue<>();
PhantomReference<String> phantomReference = new PhantomReference<String>(str, referenceQueue);
str = null;
System.out.println(phantomReference.get());
System.gc();
System.runFinalization();
System.out.println(referenceQueue.poll() == phantomReference);
}
}
運行結果:
null true
虛引用不能通過虛引用訪問被引用的對象,但是當垃圾回收後,虛引用進入了ReferenceQueue。