前言
- 在
Java
中气嫁,對(duì)象的引用類型十分重要,因?yàn)檫@取決于JVM
的GC活動(dòng) & 活動(dòng) - 本文全面 & 詳細(xì)解析
Java
的4種引用類型:強(qiáng)引用够坐、軟引用寸宵、弱引用、虛引用元咙,希望您們會(huì)喜歡
目錄
1. 簡(jiǎn)介
-
JDK 1.2
前梯影,Java
的引用類型只有2種類型:可達(dá) & 不可達(dá)
若1個(gè)對(duì)象不被任何變量引用,那么程序則無(wú)法再使用該對(duì)象
- 從
JDK 1.2
后開(kāi)始庶香,Java
的引用類型分為4種:強(qiáng)引用甲棍、軟引用、弱引用赶掖、虛引用
2. 作用
通過(guò)對(duì) 對(duì)象的引用類型進(jìn)行分級(jí)感猛,從而更加靈活地 控制對(duì)象的生命周期
3. 具體描述
下面七扰,我將詳細(xì)講解Java
的4種引用類型:強(qiáng)引用、軟引用陪白、弱引用颈走、虛引用
3.1 強(qiáng)引用(StrongReference)
- 特點(diǎn)
垃圾回收器不會(huì)回收
- 當(dāng)內(nèi)存空間不足,JVM寧愿拋出OutOfMemoryError錯(cuò)誤咱士,使程序異常終止立由,也不會(huì)靠隨意回收具有強(qiáng)引用的對(duì)象來(lái)解決內(nèi)存不足的問(wèn)題
- 使用最普遍
使用場(chǎng)景
該變量不希望被垃圾回收器回收使用示例(為1個(gè)變量創(chuàng)建強(qiáng)引用)
String s="abc"
// 變量s = 字符串對(duì)象"abc"的一個(gè)強(qiáng)引用
// 注:只要給強(qiáng)引用對(duì)象賦空值null,該對(duì)象就可被垃圾回收器回收
// 即:只要給強(qiáng)引用對(duì)象s賦空值null序厉,該對(duì)象就可以被垃圾回收器回收锐膜。因?yàn)樵搶?duì)象此時(shí)不再含有其他強(qiáng)引用
3.2 軟引用(SoftReference)
特點(diǎn)
當(dāng)內(nèi)存不足時(shí),垃圾回收器會(huì)回收應(yīng)用場(chǎng)景
內(nèi)存敏感的數(shù)據(jù)緩存機(jī)制脂矫,如圖片枣耀、網(wǎng)頁(yè)緩存等使用示例(為1個(gè)變量創(chuàng)建軟引用)
// 1. 聲明強(qiáng)引用
String str=new String("Test");
// 2. 對(duì)str進(jìn)行軟引用
ReferenceQueue<String> rq=new ReferenceQueue<String>();
SoftReference<String> sr=new SoftReference<String>(str,rq);
// 3. 撤掉強(qiáng)引用
str=null;
// 4. 取出軟引用的對(duì)象:s即為str所指引的對(duì)象"Test"
String s=sr.get();
// 注:
// a. 軟引用可與1個(gè)引用隊(duì)列聯(lián)合使用
// b. 若軟引用所引用的對(duì)象被垃圾回收器回收,JVM就會(huì)把這個(gè)軟引用加入到與之關(guān)聯(lián)的引用隊(duì)列中
3.3 弱引用(WeakReference)
- 特點(diǎn)
一旦發(fā)現(xiàn)弱引用對(duì)象庭再,無(wú)論內(nèi)存足否捞奕,都會(huì)進(jìn)行回收
即 擁有更短暫的生命周期
應(yīng)用場(chǎng)景
1.防止內(nèi)存泄漏,保證內(nèi)存被JVM
回收
2.保護(hù)對(duì)象引用使用示例(為1個(gè)變量創(chuàng)建弱引用)
// 1. 聲明強(qiáng)引用
Counter counter = new Counter();
// 2. 聲明弱引用
WeakReference<Counter> weakCounter = new WeakReference<Counter>(counter);
// 3. 撤掉強(qiáng)引用
counter = null;
// 注:
// a. 使用 類似軟引用拄轻,即也可與1個(gè)引用隊(duì)列聯(lián)合使用
// b. 與軟引用的區(qū)別:具備更短的生命周期
3.4 虛引用(PhantomReference)
特點(diǎn)
任何時(shí)候都可能被垃圾回收器回收應(yīng)用場(chǎng)景
跟蹤對(duì)象被GC回收的活動(dòng)
通過(guò)判斷引用隊(duì)列中是否有虛引用來(lái)了解被引用對(duì)象是否被回收
- 使用示例(為1個(gè)變量創(chuàng)建虛引用)
// 虛引用 必須 和引用隊(duì)列 (ReferenceQueue)聯(lián)合使用
// 即 當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí)颅围,若發(fā)現(xiàn)它還有虛引用,在回收對(duì)象的內(nèi)存之前恨搓,把這個(gè)虛引用加入到與之關(guān)聯(lián)的引用隊(duì)列中
// 1. 聲明強(qiáng)引用
DigitalCounter digit = new DigitalCounter();
// 2. 聲明虛引用
PhantomReference phantom = new PhantomReference(digit);
// 3. 撤掉強(qiáng)引用
digit = null;
至此院促,關(guān)于Java
的4種引用類型:強(qiáng)引用、軟引用斧抱、弱引用常拓、虛引用 講解完畢。
4. 總結(jié)
本文全面講解Java
的4種引用類型:強(qiáng)引用辉浦、軟引用弄抬、弱引用、虛引用宪郊,總結(jié)如下:
歡迎關(guān)注Carson_Ho的簡(jiǎn)書(shū)掂恕!
分享Android技術(shù)干貨,追求短弛槐、平懊亡、快,但卻不缺深度乎串。
請(qǐng)點(diǎn)贊店枣!因?yàn)槟愕墓膭?lì)是我寫(xiě)作的最大動(dòng)力!
相關(guān)文章閱讀
Carson帶你學(xué)Android:學(xué)習(xí)方法
Carson帶你學(xué)Android:四大組件
Carson帶你學(xué)Android:自定義View
Carson帶你學(xué)Android:異步-多線程
Carson帶你學(xué)Android:性能優(yōu)化
Carson帶你學(xué)Android:動(dòng)畫(huà)