Wiem, że każdy obiekt wymaga pamięci stosu, a każda operacja podstawowa / referencja na stosie wymaga pamięci stosu.
Gdy próbuję utworzyć obiekt na stercie i nie ma wystarczającej pamięci, aby to zrobić, JVM tworzy błąd java.lang.OutOfMemoryError na stercie i rzuca mi go.
Tak więc domyślnie oznacza to, że JVM ma trochę pamięci zarezerwowanej podczas uruchamiania.
Co się stanie, gdy ta zarezerwowana pamięć zostanie zużyta (zdecydowanie by się zużyła, przeczytaj dyskusję poniżej) i JVM nie ma wystarczającej ilości pamięci na stercie, aby utworzyć instancję java.lang.OutOfMemoryError ?
Czy to po prostu się zawiesza? A może rzuci mnie, null
skoro nie ma pamięci dla new
instancji OOM?
try {
Object o = new Object();
// and operations which require memory (well.. that's like everything)
} catch (java.lang.OutOfMemoryError e) {
// JVM had insufficient memory to create an instance of java.lang.OutOfMemoryError to throw to us
// what next? hangs here, stuck forever?
// or would the machine decide to throw us a "null" ? (since it doesn't have memory to throw us anything more useful than a null)
e.printStackTrace(); // e.printStackTrace() requires memory too.. =X
}
==
Dlaczego JVM nie może zarezerwować wystarczającej ilości pamięci?
Bez względu na to, ile pamięci jest zarezerwowane, nadal można wykorzystać tę pamięć, jeśli JVM nie ma możliwości „odzyskania” tej pamięci:
try {
Object o = new Object();
} catch (java.lang.OutOfMemoryError e) {
// JVM had 100 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e2) {
// JVM had 99 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e3) {
// JVM had 98 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e4) {
// JVM had 97 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e5) {
// JVM had 96 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e6) {
// JVM had 95 units of "spare memory". 1 is used to create this OOM.
e.printStackTrace();
//........the JVM can't have infinite reserved memory, he's going to run out in the end
}
}
}
}
}
}
Lub bardziej zwięźle:
private void OnOOM(java.lang.OutOfMemoryError e) {
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e2) {
OnOOM(e2);
}
}
OutOfMemoryException
a następnie robiła coś, co wymagało utworzenia dużego bufora ...
OutOfMemoryError
i zachowa odniesienie do niej. Okazuje się, że złapanie a OutOfMemoryError
nie jest tak przydatne, jak mogłoby się wydawać, ponieważ nie można zagwarantować prawie nic ze stanu programu, kiedy go złapie. Zobacz stackoverflow.com/questions/8728866/…