強引用、軟引用、弱引用、幻象引用有什麼區別?

在 Java 語言中,除了原始數據類型的變數,其他所有都是所謂的引用類型,指向各種不同的對象,Java中根據其生命周期的長短,將引用分為4類,分別是強引用、弱引用、軟引用和幻象引用(虛引用),不同的引用類型,主要體現的是對象不同的可達性狀態和對垃圾回收集的影響。

強引用

  • 什麼是強引用

Object obj = new Object(),這裡的的obj就是強引用,通過關鍵字new創建的對象所關聯的引用就是強引用。 只要有強引用指向一個對象,就能表明對象還活著,垃圾收集器就不會觸碰這種對象,當JVM記憶體空間不足,JVM寧願拋出OutOfMemoryError運行時錯誤(OOM),使程式異常終止,也不會靠隨意回收具有強引用的「存活」對象來解決記憶體不足的問題。對於一個普通的對象,如果沒有其他的引用關係,只要超過了引用的作用域或者顯式地將相應(強)引用賦值為 null,就是可以被垃圾收集的了,具體回收時機還是要看垃圾收集策略

軟引用

  • 什麼是軟引用

是一種相對強引用弱化一些的引用,可以讓對象豁免一些垃圾收集,只有當 JVM 認為記憶體不足時,才會去試圖回收軟引用指向的對象。

軟引用通過SoftReference類實現。 軟引用的生命周期比強引用短一些。只有當 JVM 認為記憶體不足時,才會去試圖回收軟引用指向的對象:即JVM 會確保在拋出 OutOfMemoryError 之前,清理軟引用指向的對象

  • 有什麼應用場景

軟引用通常用來實現記憶體敏感的快取。如果還有空閑記憶體,就可以暫時保留快取,當記憶體不足時清理掉,這樣就保證了使用快取的同時,不會耗盡記憶體。

弱引用

  • 什麼是弱引用

並不能使對象豁免垃圾收集,僅僅是提供一種訪問在弱引用狀態下對象的途徑。這就可以用來構建一種沒有特定約束的關係,比如,維護一種非強制性的映射關係,如果試圖獲取時對象還在,就使用它,否則重現實例化

弱引用通過WeakReference類實現。 弱引用的生命周期比軟引用短。在垃圾回收器執行緒掃描它所管轄的記憶體區域的過程中,一旦發現了具有弱引用的對象,不管當前記憶體空間足夠與否,都會回收它的記憶體

  • 有什麼應用場景

弱應用同樣可用於記憶體敏感的快取

幻象引用(虛引用)

  • 什麼是幻象引用

虛引用也叫幻象引用,通過PhantomReference類來實現。無法通過虛引用訪問對象的任何屬性或函數。幻象引用僅僅是提供了一種確保對象被 finalize 以後,做某些事情的機制。如果一個對象僅持有虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收

  • 有什麼應用場景

可用來跟蹤對象被垃圾回收器回收的活動,當一個虛引用關聯的對象被垃圾收集器回收之前會收到一條系統通知

歡迎大家去 我的部落格 瞅瞅,裡面有更多關於測試實戰的內容哦!!