強引用、軟引用、弱引用、幻象引用有什麼區別?
在 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java引用型別解析:掌握強引用、軟引用、弱引用和幻象引用的妙用Java型別
- java的強引用、軟引用、弱引用、幻象引用,引用佇列總結Java佇列
- 強引用、軟引用、弱引用、幻象引用再不理解就晚了
- 關於強引用、軟引用、弱引用、幻象引用,你該如何回答?
- 強引用 軟引用 弱引用 虛引用
- 強引用,軟引用,弱引用,虛引用
- 強引用、軟引用、弱引用、虛引用
- Java 中的強引用、軟引用、弱引用和虛引用分別是什麼?Java
- 強引用、軟引用、弱引用與虛引用
- Java的強引用、軟引用、弱引用、虛引用Java
- 【JVM】如何理解強引用、軟引用、弱引用、虛引用?JVM
- Java四種引用包括強引用,軟引用,弱引用,虛引用。Java
- Java/Android中的強引用、軟引用、弱引用、虛引用JavaAndroid
- 理解Java的強引用、軟引用、弱引用和虛引用Java
- Java四大引用詳解:強引用、軟引用、弱引用、虛引用Java
- Java常見知識點彙總(⑲)——Java中的強引用、弱引用、軟引用、虛引用Java
- 老徐和阿珍的故事:強引用、軟引用、弱引用、虛引用,傻傻分不清楚
- python3學習筆記之 強引用和弱引用Python筆記
- 垃圾回收(四)【弱引用】
- Java中的弱引用Java
- Java中強、軟、弱、虛四種引用詳解Java
- Swift 4 弱引用實現Swift
- Python迴圈引用是什麼?如何避免迴圈引用?Python
- 從原始碼解析 Swift 弱引用原始碼Swift
- 指標和引用的區別指標
- 物件與物件引用的區別物件
- require和import引用的區別UIImport
- 引用
- js引用型別JS型別
- javascript:引用型別JavaScript型別
- python的引用是什麼Python
- python反向引用是什麼?Python
- 引用以及引用的實質
- JVM 符號引用和直接引用JVM符號
- Go 的引用型別Go型別
- Golang 引用型別-mapGolang型別
- 引用型別之Object型別Object
- Webpack模組引用中還有什麼坑?Web