更新時間:2019-12-18 16:30:09 來源:動力節點 瀏覽2503次
1.java的引用類型分為強引用,軟引用,和弱引用以及虛引用.
創建強引用
String text=new String("123");
利用=號來創建強引用
創建軟引用
SoftReferencesfr=new SoftReference(text);
針對上面的對象創建了一個軟引用,相當于對于同一個對象123,創建了兩個引用,分別是強引用和軟引用
創建弱引用
WeakReferencewrf=new WeakReference(text);
同理,針對同一個變量創建三個引用,分別是強引用,軟引用和弱引用
另外還有最后一個虛引用,這里省略
2.關于四種引用,不同情況還有一種特性叫作及物性
例如,不管對于一個變量,創建了多少種引用,只要存在強引用,那么這個變量就叫做強及物性,針對這種情況,垃圾回收器,也就是gc,是永遠不會回
收這種變量的.
假如,驅除了強引用,只剩下了軟引用和弱引用,那么這時候這個變量就叫做軟及物,針對這種情況,gc只有在內存不夠的情況下,才會回收變量
最后,驅除了強引用和軟引用,只剩下弱引用的時候,gc只要發現了這個變量,就會馬上回收內存.
3.案例演示
①案例一:
//在堆里面創建一個對象,即是 new String(),同時也會在常量池里面創建一個常量,即是123; 并且String text指向的是堆里面的對象
String text=new String("123");
//創建軟引用
SoftReferencesfr=new SoftReference(text);
//創建弱引用
WeakReferencewrf=new WeakReference(text);
//這時候,變量是屬于強引用.
System.out.println(text);
②案例二:
//在堆里面創建一個對象,即是 new String(),同時也會在常量池里面創建一個常量,即是123; 并且String text指向的是堆里面的對象
String text=new String("123");
//創建軟引用
SoftReferencesfr=new SoftReference(text);
//創建弱引用
WeakReferencewrf=new WeakReference(text);
//這時候,變量是屬于強引用.
System.out.println(text);
//這時候驅除了強引用,也就是變量屬于軟引用,當內存不夠的時候,gc才會回收
text=null;
//打印輸出變量的取值
System.out.println(sfr.get());
System.out.println(wrf.get());
//這時候是可以輸出123的效果的.
③案例三:
//在堆里面創建一個對象,即是 new String(),同時也會在常量池里面創建一個常量,即是123; 并且String text指向的是堆里面的對象
String text=new String("123");
//創建軟引用
SoftReferencesfr=new SoftReference(text);
//創建弱引用
WeakReferencewrf=new WeakReference(text);
//這時候,變量是屬于強引用.
System.out.println(text);
//這時候驅除了強引用,也就是變量屬于軟引用,當內存不夠的時候,gc才會回收
text=null;
//這時候去除了軟引用,也就是說變量是屬于弱引用,只要gc發現了該變量,就會回收該內存
sfr.clear();
//調用gc來回收變量,理論上,雖然即是調用了gc,但是gc也不是馬上會運行的,她自己會負責垃圾的回收.但是其實,一般來說,只要調用了gc,一般
來說,gc是會馬上運行的
System.gc();
//這時候,弱引用是拿不到值的,因為,前面調用了gc,而gc發現了變量,就會馬上回收內存,所以說變量已經不存在了,自然就沒有取值了.所以下面
代碼輸出為null
System.out.println(wrf.get());
注意點:
gc回收的內存是只針對堆里面的,
所以假如我們一開始的變量是這樣創建的,是可以被回收的.
String text=new String("123");
但是假如我們的變量是這樣子創建了,gc就無法回收內存了,而且弱引用仍舊可以輸出123的值
String text="123"
這代碼只是在常量池里面創建了常量123,并沒有在堆里面創建了變量new String,所以只針對堆的內存回收的gc自然就不起效果了,也就導致了常量123沒有被回收,所以弱引用還可以輸出值
以上就是動力節點Java培訓機構小編介紹的“Java培訓教程:Java的引用類型”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
Java全套自學資料
Java自學視頻教程(免費下載學習):http://m.dabaquan.cn/video.html
Java技術教程:http://m.dabaquan.cn/tutorial/
相關文章
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習