Saya sadar bahwa setiap objek membutuhkan memori tumpukan dan setiap primitif / referensi pada stack memerlukan memori tumpukan.
Ketika saya mencoba membuat objek di heap dan ada memori yang tidak cukup untuk melakukannya, JVM membuat java.lang.OutOfMemoryError pada heap dan melemparkannya ke saya.
Jadi secara implisit, ini berarti bahwa ada beberapa memori yang disediakan oleh JVM saat startup.
Apa yang terjadi ketika memori yang dicadangkan ini digunakan (pasti akan digunakan, baca diskusi di bawah) dan JVM tidak memiliki cukup memori pada heap untuk membuat instance java.lang.OutOfMemoryError ?
Apakah hanya menggantung? Atau apakah dia akan melemparkan saya null
karena tidak ada memori untuk new
instance 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
}
==
Mengapa JVM tidak dapat menyimpan memori yang cukup?
Tidak peduli berapa banyak memori yang dicadangkan, masih mungkin memori itu digunakan jika JVM tidak memiliki cara untuk "merebut kembali" memori itu:
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
}
}
}
}
}
}
Atau lebih ringkas:
private void OnOOM(java.lang.OutOfMemoryError e) {
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e2) {
OnOOM(e2);
}
}
OutOfMemoryException
dan kemudian melakukan sesuatu yang melibatkan pembuatan buffer besar ...
OutOfMemoryError
dan mempertahankan referensi untuk itu. Terlihat bahwa menangkap OutOfMemoryError
tidak berguna seperti yang mungkin dipikirkan orang, karena Anda hampir tidak dapat memastikan keadaan program Anda saat menangkapnya. Lihat stackoverflow.com/questions/8728866/…