1. 前言
今天學習了「Java核心技術(shù)36講」的第4講關(guān)于強引用、軟引用、弱引用、幻象引用的區(qū)別,理解了引用對于Java對象生命周期與JVM內(nèi)部相關(guān)機制,在這里總結(jié)一下相關(guān)的知識點
2. Java中的數(shù)據(jù)類型
-
原始數(shù)據(jù)類型
包括了byte、int、char、long、float、double、boolean和short,還有對應的封裝類Boolean、Character、Byte、Short、Integer、Long、Float、Double,在聲明原始數(shù)據(jù)類型的變量后會直接將值存儲在棧(stack)中,所以原始數(shù)據(jù)類型的缺省值是根據(jù)不同類型說定,如:int類型的缺省值為0 -
引用數(shù)據(jù)類型
包括class、interface、array,在聲明引用數(shù)據(jù)類型的變量后在棧(stack)中存儲的只是內(nèi)存地址(類似C/C++的指針),真正的值是存在堆(heap)中,所以引用類型的缺省值為null -
知識點的應用
- 引用數(shù)據(jù)類型間的"=="判斷內(nèi)存地址是否相等,想判斷內(nèi)容實體需要使用equals
- 原始數(shù)據(jù)類型傳值傳參傳的是副本,修改后原值不變;而引用數(shù)據(jù)類型傳值傳參穿的是地址,修改后原值改變
3. 四種引用
不同的引用類型,主要體現(xiàn)的是對象不同的可達性(reachable)狀態(tài)和對垃圾回收的影響
3.1 強引用(StrongReference)
強引用是我們最常使用的普通對象引用,舉個例子:
Object obj = new Object();//這種就是強引用
只要有強引用指向的對象,就表明這個對象不會被回收,即使JVM內(nèi)存空間不足,拋出OutOfMemoryError(OOM)也不會回收具有強引用的對象。對于一個普通的對象,如果沒有其他的引用關(guān)系,在超過了引用的作用域或者顯示地將其賦值為null時,才可被垃圾收集
3.2 軟引用(SoftReference)
通過SoftReference類實現(xiàn),軟引用的生命周期比強引用較短,當JVM內(nèi)存不足時,才會試圖去回收軟引用指向的對象,即在拋出OutOfMemoryError前清理軟引用指向的對象。
- 應用場景:圖片緩存框架
3.3 弱引用(WeakReference)
通過WeakReference類實現(xiàn),弱引用的生命周期比軟引用還短。在垃圾回收器線程掃描內(nèi)存區(qū)域時,一旦發(fā)現(xiàn)了具有弱引用的對象,不論當前內(nèi)存空間是否充足,都會進行回收。
3.4 幻象引用(PhantomReference)
也可以叫做虛引用(還有人叫幽靈引用),通過PhantomReference類實現(xiàn)。無法通過虛引用訪問對象的任何屬性或函數(shù),幻象引用只提供了一種確保對象被finalize后,做某些事情的機制。如果一個對象只有幻象引用,那么它隨時可能被垃圾回收器回收。
4. 總結(jié)
由于之前的學習比較隨意,導致很多知識點的掌握程度都很低,平時的開發(fā)過程中并沒有直接使用到后三種引用,所以對這四種引用都不了解,甚至沒有聽過后三種引用。由此可見學習還是得腳踏實地,熟悉掌握了這些基礎(chǔ)的知識,對以后設(shè)計緩存等框架,診斷OOM等問題都有很大幫助。
另外這里貼一個評論區(qū)的兄弟(@海怪哥哥)的理解,挺有意思的:
強引用就像大老婆,關(guān)系很穩(wěn)固
軟引用就像二老婆,隨時有失寵的可能,但也有可能扶正
弱引用就像情人,關(guān)系不穩(wěn)定,可能跟別人跑了
幻象引用就是夢中情人,只在夢中出現(xiàn)過
5. 最后
本文部分內(nèi)容摘抄于「極客時間」的Java核心技術(shù)36講中的內(nèi)容和評論中@代碼榮耀這個兄弟,在此感謝!
歡迎來看我的博客 RoNnx的博客