更新時(shí)間:2019-12-18 16:30:09 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2523次
1.java的引用類型分為強(qiáng)引用,軟引用,和弱引用以及虛引用.
創(chuàng)建強(qiáng)引用
String text=new String("123");
利用=號(hào)來(lái)創(chuàng)建強(qiáng)引用
創(chuàng)建軟引用
SoftReferencesfr=new SoftReference(text);
針對(duì)上面的對(duì)象創(chuàng)建了一個(gè)軟引用,相當(dāng)于對(duì)于同一個(gè)對(duì)象123,創(chuàng)建了兩個(gè)引用,分別是強(qiáng)引用和軟引用
創(chuàng)建弱引用
WeakReferencewrf=new WeakReference(text);
同理,針對(duì)同一個(gè)變量創(chuàng)建三個(gè)引用,分別是強(qiáng)引用,軟引用和弱引用
另外還有最后一個(gè)虛引用,這里省略
2.關(guān)于四種引用,不同情況還有一種特性叫作及物性
例如,不管對(duì)于一個(gè)變量,創(chuàng)建了多少種引用,只要存在強(qiáng)引用,那么這個(gè)變量就叫做強(qiáng)及物性,針對(duì)這種情況,垃圾回收器,也就是gc,是永遠(yuǎn)不會(huì)回
收這種變量的.
假如,驅(qū)除了強(qiáng)引用,只剩下了軟引用和弱引用,那么這時(shí)候這個(gè)變量就叫做軟及物,針對(duì)這種情況,gc只有在內(nèi)存不夠的情況下,才會(huì)回收變量
最后,驅(qū)除了強(qiáng)引用和軟引用,只剩下弱引用的時(shí)候,gc只要發(fā)現(xiàn)了這個(gè)變量,就會(huì)馬上回收內(nèi)存.
3.案例演示
①案例一:
//在堆里面創(chuàng)建一個(gè)對(duì)象,即是 new String(),同時(shí)也會(huì)在常量池里面創(chuàng)建一個(gè)常量,即是123; 并且String text指向的是堆里面的對(duì)象
String text=new String("123");
//創(chuàng)建軟引用
SoftReferencesfr=new SoftReference(text);
//創(chuàng)建弱引用
WeakReferencewrf=new WeakReference(text);
//這時(shí)候,變量是屬于強(qiáng)引用.
System.out.println(text);
②案例二:
//在堆里面創(chuàng)建一個(gè)對(duì)象,即是 new String(),同時(shí)也會(huì)在常量池里面創(chuàng)建一個(gè)常量,即是123; 并且String text指向的是堆里面的對(duì)象
String text=new String("123");
//創(chuàng)建軟引用
SoftReferencesfr=new SoftReference(text);
//創(chuàng)建弱引用
WeakReferencewrf=new WeakReference(text);
//這時(shí)候,變量是屬于強(qiáng)引用.
System.out.println(text);
//這時(shí)候驅(qū)除了強(qiáng)引用,也就是變量屬于軟引用,當(dāng)內(nèi)存不夠的時(shí)候,gc才會(huì)回收
text=null;
//打印輸出變量的取值
System.out.println(sfr.get());
System.out.println(wrf.get());
//這時(shí)候是可以輸出123的效果的.
③案例三:
//在堆里面創(chuàng)建一個(gè)對(duì)象,即是 new String(),同時(shí)也會(huì)在常量池里面創(chuàng)建一個(gè)常量,即是123; 并且String text指向的是堆里面的對(duì)象
String text=new String("123");
//創(chuàng)建軟引用
SoftReferencesfr=new SoftReference(text);
//創(chuàng)建弱引用
WeakReferencewrf=new WeakReference(text);
//這時(shí)候,變量是屬于強(qiáng)引用.
System.out.println(text);
//這時(shí)候驅(qū)除了強(qiáng)引用,也就是變量屬于軟引用,當(dāng)內(nèi)存不夠的時(shí)候,gc才會(huì)回收
text=null;
//這時(shí)候去除了軟引用,也就是說(shuō)變量是屬于弱引用,只要gc發(fā)現(xiàn)了該變量,就會(huì)回收該內(nèi)存
sfr.clear();
//調(diào)用gc來(lái)回收變量,理論上,雖然即是調(diào)用了gc,但是gc也不是馬上會(huì)運(yùn)行的,她自己會(huì)負(fù)責(zé)垃圾的回收.但是其實(shí),一般來(lái)說(shuō),只要調(diào)用了gc,一般
來(lái)說(shuō),gc是會(huì)馬上運(yùn)行的
System.gc();
//這時(shí)候,弱引用是拿不到值的,因?yàn)?前面調(diào)用了gc,而gc發(fā)現(xiàn)了變量,就會(huì)馬上回收內(nèi)存,所以說(shuō)變量已經(jīng)不存在了,自然就沒有取值了.所以下面
代碼輸出為null
System.out.println(wrf.get());
注意點(diǎn):
gc回收的內(nèi)存是只針對(duì)堆里面的,
所以假如我們一開始的變量是這樣創(chuàng)建的,是可以被回收的.
String text=new String("123");
但是假如我們的變量是這樣子創(chuàng)建了,gc就無(wú)法回收內(nèi)存了,而且弱引用仍舊可以輸出123的值
String text="123"
這代碼只是在常量池里面創(chuàng)建了常量123,并沒有在堆里面創(chuàng)建了變量new String,所以只針對(duì)堆的內(nèi)存回收的gc自然就不起效果了,也就導(dǎo)致了常量123沒有被回收,所以弱引用還可以輸出值
以上就是動(dòng)力節(jié)點(diǎn)Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java培訓(xùn)教程:Java的引用類型”的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
Java全套自學(xué)資料
Java自學(xué)視頻教程(免費(fèi)下載學(xué)習(xí)):http://www.ilovecolors.com.cn/video.html
Java技術(shù)教程:http://www.ilovecolors.com.cn/tutorial/
相關(guān)文章
零基礎(chǔ)怎么自學(xué)Java,完整版Java學(xué)習(xí)路線圖
你還在糾結(jié)學(xué)Java,是自學(xué)還是去培訓(xùn)班嗎
一個(gè)標(biāo)準(zhǔn)的Java程序員如何進(jìn)階?
Java學(xué)習(xí)路線清單,快速進(jìn)階Java
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743