Я усвідомлюю, що для кожного об'єкта потрібна купа пам’яті, а кожен примітив / посилання на стеці вимагає пам’яті стека.
Коли я намагаюся створити об’єкт на купі, і для цього недостатньо пам'яті, JVM створює java.lang.OutOfMemoryError на купі і кидає його мені.
Це неявно, це означає, що в запуску JVM є запам'ятована пам'ять.
Що станеться, коли ця зарезервована пам’ять буде використана (вона, безумовно, буде використана, читайте обговорення нижче) і JVM не вистачає пам'яті на купі, щоб створити примірник java.lang.OutOfMemoryError ?
Це просто висить? Або він би кинув мене, null
оскільки немає пам’яті new
екземпляру 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
}
==
Чому JVM не міг залишити достатню кількість пам'яті?
Незалежно від того, скільки пам’яті зарезервовано, все-таки можливо використовувати цю пам’ять, якщо JVM не має способу «відновити» цю пам’ять:
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
}
}
}
}
}
}
Або більш стисло:
private void OnOOM(java.lang.OutOfMemoryError e) {
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e2) {
OnOOM(e2);
}
}
OutOfMemoryException
та робити щось, що стосувалося створення великого буфера ...
OutOfMemoryError
і збереже посилання на неї. Виявляється, що ловити a OutOfMemoryError
- це не так корисно, як можна було б подумати, тому що ви майже нічого не можете гарантувати про стан вашої програми. Див stackoverflow.com/questions/8728866 / ...