強引用、弱引用、軟引用、虛引用
強引用(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:使用瀏覽器時,按下返回鍵後,返回後的網頁內容是重新進行請求還是存緩存中取出?
- 如果網頁在瀏覽結束時就進行內容的回收,則返回後查看前面瀏覽的頁面時,需要重新請求。
- 如果將瀏覽過的網頁儲存到內存中會造成大量內存的浪費,甚至出現內存洩漏。
這時候就可以使用軟引用
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運行後終止 |
虛引用 | Unknow | Unknow | Unknow |