JDK1.2之前只提供一種引用類型——強引用:Object obj = new Object(); 。而JDK1.2之後多出的三個選擇分別是:html
強引用java
最經常使用的引用類型,如Object obj = new Object(); 。只要強引用存在則GC時則一定不被回收。緩存
軟引用oracle
用於描述還有用但非必須的對象,當堆將發生OOM(Out Of Memory)時則會回收軟引用所指向的內存空間,若回收後依然空間不足纔會拋出 OOM 。通常用於實現內存敏感的高速緩存。htm
弱引用對象
發生GC時一定回收弱引用指向的內存空間。blog
虛引用生命週期
又稱爲幽靈引用或幻影引用,虛引用既不會影響對象的生命週期,也沒法經過虛引用來獲取對象實例,僅用於在發生GC時接收一個系統通知。內存
那麼問題來了,若一個對象的引用類型有多個,如何判斷它的可達性呢?其實規則以下:get
1. 單條引用鏈的可達性以最弱的一個引用類型來決定;
2. 多條引用鏈的可達性以最強的一個引用類型來決定;