這個問題很好的回答了@Eran,@TheLostMind和所有,所以我沒有提出同樣的觀點,我只是想借此機會就如何幫助「延緩」內存不足例外。
運行JVM參數代碼下面的代碼-Xms64m -Xmx64m
,以便您可以快速查看結果。
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class OOM {
public static void main(String[] args) {
System.out.println(new Date());
try {
scenario1(false, false); // in my box, OOM occurred with average of 2 seconds.
//scenario1(true, false); // in my box, OOM occurred average of 6 seconds.
//scenario1(false, true); // in my box, OOM occurred average of 8 seconds.
} catch (Exception e) {
} catch (Error err){
}
System.out.println(new Date());
}
private static void scenario1(boolean useSoftReference, boolean useWeakReference) {
List<Object> list = new ArrayList<>();
while (true) {
for(int i = 0; i < 1000000; i++){
if(useSoftReference){
list.add(new SoftReference<Object>(new Object()));
} else if(useWeakReference){
list.add(new WeakReference<Object>(new Object()));
} else{
list.add(new Object());
}
}
}
}
}
簡單的內存泄漏...對於第二個示例,您簡化了垃圾收集器的工作 – FieryCat
Java使用堆垃圾收集器存儲新對象的堆。當堆已滿並且gc無法容納新對象時拋出OutOfMemoryError。當沒有足夠的本地內存來加載java類時,也會拋出這個錯誤。 –
@FieryCat不會簡化......在第一種情況下,根本沒有任何垃圾收集。 – wvdz