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

karspb發表於2021-09-09

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

強引用

  • 什麼是強引用

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

軟引用

  • 什麼是軟引用

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

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

  • 有什麼應用場景

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

弱引用

  • 什麼是弱引用

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

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

  • 有什麼應用場景

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

幻象引用(虛引用)

  • 什麼是幻象引用

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

  • 有什麼應用場景

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2001/viewspace-2825182/,如需轉載,請註明出處,否則將追究法律責任。

相關文章