1)強引用(默認支持模式)
當內存不足,JVM開始垃圾回收,對於強引用的對象,就算是出現了OOM也不會對該對象進行回收,死都不收。強引用是我們最常見的普通對象引用,只要還有強引用指向一個對象,就能表明對象還“活着”,垃圾收集器不會碰這種對象。在Java中最常見的就是強引用,把一個對象賦給一個引用變量,這個引用變量就是一個強引用。當一個對象被強引用變量引用時,它處於可達狀態,它是不可能被垃圾回收機制回收的,即使該對象以後永遠都不會被用到,JVM也不會回收。因此 強引用是造成Java內存泄漏 的主要原因之一。
對於一個普通對象,如果沒有其它的引用關係,只要超過了引用的作用域或者顯示地將相應(強)引用賦值爲null,一般認爲就是可以被垃圾收集的了(不過回收時機還是要看垃圾收集策略)。
2)軟引用
軟引用是一種相對強引用弱化了一些的引用,需要用 java.lang.ref.SoftReference 類來實現,可以讓對象豁免一些垃圾收集。
對於只有軟引用的對象來說:當系統內存充足時它不會被回收,不足時會被回收。
軟引用通常用在對內存敏感的程序中,比如高速緩存就有用到軟引用,內存夠用的時候就保留,不夠用就回收。
3)弱引用
弱引用需要用 java.lang.ref.WeakReference 類來實現,它比軟引用的生存期更短。
對於只有弱引用的對象來說,只要垃圾回收機制一運行,不管JVM的內存空間是否足夠,都會回收該對象佔用的內存。
4)虛引用
需要使用 java.lang.ref.PhantomReference 類來實現。
顧名思義,就是形同虛設,與其他集中引用都不同,虛引用並不會決定對象的生命週期。
如果一個對象僅持有虛引用,那麼它就和沒有任何引用一樣,再任何時候都可能被垃圾回收器回收,它不能單獨使用也不能通過它訪問對象,虛引用必須和引用隊列(ReferenceQueue)聯合使用。
虛引用的主要作用是跟蹤對象被垃圾回收的狀態。僅僅是提供了一種確保對象被 finalize 以後,做某些事情的機制。
PhantomReference 的get方法總是返回null,因此無法訪問對應的引用對象。其意義在於說明一個對象已經進入 finalization 階段,可以被GC回收,用來實現比 finalization 機制更靈活的回收操作。
換句話說,設置虛引用關聯的唯一目的,就是在這個對象被收集器回收的時候,收到一個系統通知或者後續添加進一步的處理。
Java技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。