通过反复试验,我了解到这11_451_104
是一个神奇的数字,它会导致我的机器抛出 OOM 错误。
使用11_451_103
,我正在打包尽可能多的数据。
private static void init() {
int i = 0;
try {
while (++i < 11451104) {
list.add("a");
}
} catch (OutOfMemoryError e) {
System.out.println("oh no, not again :("); // <-- Not getting here
}
}
如果在下一行我做
String x = "some new string";
我希望会发生异常,因为堆无法为另外 1 个字符串分配空间。然而,事实并非如此。
如果我尝试将此新字符串添加到列表中,
String x = "some new string"; // <-- expect OOM Error to happen here
list.add(x);
程序确实因 OOM 而中止。为什么在字符串分配时没有发生这种情况?
如何最好地保护自己知道 OOM 是一种可能性,因为可能需要保存未知(可能非常大)数量的数据?序列化和持久化到磁盘是解决这个问题的方法吗?