本博客來自鏈接部分,關于 OOM 繼續(xù)學習憋沿, 本博客中有幾種 OOM 解決方案逛揩,值得參考,對原作者表示感謝 馋嗜。
1.1:強引用
例如下面代碼:
Object o=new Object(); //在heap堆中創(chuàng)建新的Object對象通過o引用這個對象
Object o1=o; //通過o建立o1到new Object()這個heap堆中的對象的引用
這兩個引用都是強引用.只要存在對heap中對象的引用齐板,gc就不會收集該對象
String abc=new String("abc"); //1 強
SoftReference<String> abcSoftRef=new SoftReference<String>(abc); //2 軟
WeakReference<String> abcWeakRef = new WeakReference<String>(abc); //3 弱
abc=null; //4 軟
abcSoftRef.clear();//5 弱
第一行 : * 在heap對中創(chuàng)建內容為“abc”的對象,并建立abc到該對象的強引用,該對象是強可及的葛菇。*
第二行甘磨、第三行 : * 分別建立對heap中對象的軟引用和弱引用,此時heap中的對象仍是強可及的眯停。*
第四行 : * 之后heap中對象不再是強可及的济舆,變成軟可及的。*
第五行: * 執(zhí)行之后變成弱可及的庵朝。*
1.2:軟引用
軟引用是主要用于內存敏感的高速緩存吗冤。在jvm報告內存不足之前會清除所有的軟引用又厉,這樣以來gc就有可能收集軟可及的對象,可能解決內存吃緊問題椎瘟,避免內存溢出覆致。什么時候會被收集取決于gc的算法和gc運行時可用內存的大小
。當gc決定要收集軟引用是執(zhí)行以下過程,以上面的abcSoftRef為例:
首先將abcSoftRef的referent設置為null肺蔚,不再引用heap中的new String("abc")對象煌妈。
將heap中的new String("abc")對象設置為可結束的(finalizable)。
當heap中的new String("abc")對象的finalize()方法被運行而且該對象占用的內存被釋放宣羊, abcSoftRef被添加到它的ReferenceQueue中璧诵。
被 Soft Reference 指到的對象,即使沒有任何 Direct Reference仇冯,也不會被清除之宿。一直要到 JVM 內存不足且 沒有 Direct Reference 時才會清除,SoftReference 是用來設計 object-cache 之用的苛坚。如此一來 SoftReference 不但可以把對象 cache 起來比被,也不會造成內存不足的錯誤 (OutOfMemoryError)。
A obj = new A();
Refenrence sr = new SoftReference(obj);
//引用時
if(sr!=null){
obj = sr.get();
}else{
obj = new A();
sr = new SoftReference(obj);
}
1.3:弱引用
當gc碰到弱可及對象泼舱,并釋放abcWeakRef的引用等缀,收集該對象。但是gc可能需要對此運用才能找到該弱可及對象娇昙。通過如下代碼可以了明了的看出它的作用:
String abc=new String("abc");
WeakReference<String> abcWeakRef = new WeakReference<String>(abc);
abc=null;
System.out.println("before gc: "+abcWeakRef.get());
System.gc();
System.out.println("after gc: "+abcWeakRef.get());
運行結果:
before gc: abc
after gc: null