这个问题很好的回答了@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