1. 前言
今天學(xué)習(xí)了「Java核心技術(shù)36講」的第4講關(guān)于強(qiáng)引用捏检、軟引用荞驴、弱引用、幻象引用的區(qū)別贯城,理解了引用對于Java對象生命周期與JVM內(nèi)部相關(guān)機(jī)制熊楼,在這里總結(jié)一下相關(guān)的知識點(diǎn)
2. Java中的數(shù)據(jù)類型
-
原始數(shù)據(jù)類型
包括了byte、int能犯、char鲫骗、long、float踩晶、double执泰、boolean和short,還有對應(yīng)的封裝類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 -
知識點(diǎn)的應(yīng)用
- 引用數(shù)據(jù)類型間的"=="判斷內(nèi)存地址是否相等,想判斷內(nèi)容實(shí)體需要使用equals
- 原始數(shù)據(jù)類型傳值傳參傳的是副本做修,修改后原值不變霍狰;而引用數(shù)據(jù)類型傳值傳參穿的是地址,修改后原值改變
3. 四種引用
不同的引用類型饰及,主要體現(xiàn)的是對象不同的可達(dá)性(reachable)狀態(tài)和對垃圾回收的影響
3.1 強(qiáng)引用(StrongReference)
強(qiáng)引用是我們最常使用的普通對象引用蔗坯,舉個例子:
Object obj = new Object();//這種就是強(qiáng)引用
只要有強(qiáng)引用指向的對象,就表明這個對象不會被回收燎含,即使JVM內(nèi)存空間不足宾濒,拋出OutOfMemoryError(OOM)也不會回收具有強(qiáng)引用的對象。對于一個普通的對象屏箍,如果沒有其他的引用關(guān)系绘梦,在超過了引用的作用域或者顯示地將其賦值為null時,才可被垃圾收集
3.2 軟引用(SoftReference)
通過SoftReference類實(shí)現(xiàn)赴魁,軟引用的生命周期比強(qiáng)引用較短卸奉,當(dāng)JVM內(nèi)存不足時,才會試圖去回收軟引用指向的對象颖御,即在拋出OutOfMemoryError前清理軟引用指向的對象榄棵。
- 應(yīng)用場景:圖片緩存框架
3.3 弱引用(WeakReference)
通過WeakReference類實(shí)現(xiàn),弱引用的生命周期比軟引用還短潘拱。在垃圾回收器線程掃描內(nèi)存區(qū)域時秉继,一旦發(fā)現(xiàn)了具有弱引用的對象,不論當(dāng)前內(nèi)存空間是否充足泽铛,都會進(jìn)行回收。
3.4 幻象引用(PhantomReference)
也可以叫做虛引用(還有人叫幽靈引用)辑鲤,通過PhantomReference類實(shí)現(xiàn)盔腔。無法通過虛引用訪問對象的任何屬性或函數(shù),幻象引用只提供了一種確保對象被finalize后,做某些事情的機(jī)制弛随。如果一個對象只有幻象引用瓢喉,那么它隨時可能被垃圾回收器回收。
4. 總結(jié)
由于之前的學(xué)習(xí)比較隨意舀透,導(dǎo)致很多知識點(diǎn)的掌握程度都很低栓票,平時的開發(fā)過程中并沒有直接使用到后三種引用,所以對這四種引用都不了解愕够,甚至沒有聽過后三種引用走贪。由此可見學(xué)習(xí)還是得腳踏實(shí)地,熟悉掌握了這些基礎(chǔ)的知識惑芭,對以后設(shè)計(jì)緩存等框架坠狡,診斷OOM等問題都有很大幫助。
另外這里貼一個評論區(qū)的兄弟(@海怪哥哥)的理解遂跟,挺有意思的:
強(qiáng)引用就像大老婆逃沿,關(guān)系很穩(wěn)固
軟引用就像二老婆,隨時有失寵的可能幻锁,但也有可能扶正
弱引用就像情人凯亮,關(guān)系不穩(wěn)定,可能跟別人跑了
幻象引用就是夢中情人哄尔,只在夢中出現(xiàn)過
5. 最后
本文部分內(nèi)容摘抄于「極客時間」的Java核心技術(shù)36講中的內(nèi)容和評論中@代碼榮耀這個兄弟假消,在此感謝!
歡迎來看我的博客 RoNnx的博客