Durch Versuch und Irrtum habe ich gelernt, dass 11_451_104
ist die magische Zahl, die bei meinem Rechner den OOM-Fehler auslöst.
Verwendung von 11_451_103
Ich packe so viele Daten hinein, wie ich aufnehmen kann.
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
}
}
Wenn ich in der nächsten Zeile
String x = "some new string";
Ich würde erwarten, dass eine Ausnahme auftritt, da der Heap keinen Platz für eine weitere Zeichenfolge zuweisen kann. Doch das ist nicht der Fall.
Wenn ich versuche, diese neue Zeichenfolge in die Liste aufzunehmen,
String x = "some new string"; // <-- expect OOM Error to happen here
list.add(x);
Das Programm bricht mit OOM ab. Warum geschah dies nicht bei der Zuweisung von Zeichenketten?
Wie kann man sich am besten schützen, wenn man weiß, dass OOM eine Möglichkeit ist, da eine unbekannte (möglicherweise sehr große) Menge an Daten gespeichert werden muss? Ist Serialisierung und Persistenz auf der Festplatte ein guter Weg, um damit umzugehen?