試行錯誤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 が可能であることを知って自分自身を保護する最善の方法は? ディスクへのシリアル化と永続性は、これを処理する方法ですか?