強引用、弱引用、軟引用、虛引用

強引用、弱引用、軟引用、虛引用


強引用(StrongReference) (使用最普遍的引用)

如果對象具有強引用,則垃圾回收器決不會回收它。

Object o=new Object(); // 強引用

當內存空間不足時,JVAV 虛擬機寧可拋出 OutOfMemoryError 錯誤,使程序異常終止,也不會隨意回收具有強引用的對象來解決內存不足的問題。

如果不使用時,要通過如下方式來弱化引用:

o = null

顯示設定為 null 時,GC 認為該對象不存在引用,內存不足時,就會回收這個對象,至於什麼時候回收取決於 GC 的算法。

public void test(){
	Object o=new Object();
	// 省略其他操作
}

引用會保存在棧中,引用內容保存在堆中
當這個方法運行完成後就退出方法棧,則引用內容的引用將不存在,這個 Object 會被回收。


軟引用(SoftReference) (可實現內存敏感的高速緩存)

如果對象具有軟引用,則內存空間不足時,則垃圾回收器將會回收它。

 String str=new String("abc");// 強引用
 SoftReference<String> softRef=new SoftReference<String>(str);//  軟引用

當內存不足時,等價於:

If(JVM.内存不足()) {
   str = null;//  轉換為軟引用
   System.gc();// 垃圾回收器進行回收
}

Ex:使用瀏覽器時,按下返回鍵後,返回後的網頁內容是重新進行請求還是存緩存中取出?

  1. 如果網頁在瀏覽結束時就進行內容的回收,則返回後查看前面瀏覽的頁面時,需要重新請求。
  2. 如果將瀏覽過的網頁儲存到內存中會造成大量內存的浪費,甚至出現內存洩漏。

這時候就可以使用軟引用

Browser prev = new Browser();// 獲取頁面進行瀏覽
SoftReference sr = new SoftReference(prev);// 瀏覽完畢後設定為軟引用		
if(sr.get()!=null){ 
	rev = (Browser) sr.get();// 還沒有被垃圾回收器回收,將直接從內存中獲取
}else{
	prev = new Browser();// 重新構建
	sr = new SoftReference(prev);
}

弱引用(WeakReference)

如果對象具有弱引用,一旦垃圾回收器掃描時發現了只具有弱引用的對象,不管內存空間是否足夠,都會回收它的內存。

String str=new String("abc");    
WeakReference<String> abcWeakRef = new WeakReference<String>(str);
str=null;  

當垃圾回收器進行掃描時等價於:

str = null;
System.gc();

如果這對象是偶爾使用,並且希望在使用時隨時就能獲取,但又不想影響此對象的垃圾收集,可以使用弱引用

String  abc = abcWeakRef.get();// 會讓 str 再次轉變為強引用

虛引用(PhantomReference)

如果對象具有虛引用,那麼它就和沒有任何引用一樣,任何時候都可能被垃圾回收器回收


總結

Java 以上四種引用的級別由高到低依次為:
強引用  >  軟引用  >  弱引用  >  虚引用

引用類型被垃圾回收時候用途生存時間
強引用從來不會對象的一班狀態JVM停止運行時終止
軟引用在內存不足時對象緩存內存不足時終止
弱引用在垃圾回收時對象緩存gc運行後終止
虛引用UnknowUnknowUnknow

參考文獻

Java四种引用—强、软、弱、虚的知识点总结 - 我一直很棒,这个不用质疑 - CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值