Tôi biết rằng mọi đối tượng đều yêu cầu bộ nhớ heap và mọi tham chiếu nguyên thủy / tham chiếu trên ngăn xếp đều yêu cầu bộ nhớ stack.
Khi tôi cố gắng tạo một đối tượng trên heap và không đủ bộ nhớ để làm điều đó, JVM tạo một java.lang.OutOfMemoryError trên heap và ném nó cho tôi.
Vì vậy, điều này có nghĩa là có một số bộ nhớ được dành cho JVM khi khởi động.
Điều gì xảy ra khi bộ nhớ dành riêng này được sử dụng hết (chắc chắn sẽ được sử dụng hết, đọc thảo luận bên dưới) và JVM không có đủ bộ nhớ trên heap để tạo một thể hiện của java.lang.OutOfMemoryError ?
Nó chỉ treo? Hay anh ta sẽ ném cho tôi null
vì không có ký ức nào cho 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
}
==
Tại sao JVM không thể dự trữ đủ bộ nhớ?
Cho dù có bao nhiêu bộ nhớ được bảo lưu, vẫn có thể sử dụng hết bộ nhớ đó nếu JVM không có cách "lấy lại" bộ nhớ đó:
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
}
}
}
}
}
}
Hay chính xác hơn:
private void OnOOM(java.lang.OutOfMemoryError e) {
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e2) {
OnOOM(e2);
}
}
OutOfMemoryException
và sau đó làm một việc gì đó liên quan đến việc tạo ra một bộ đệm lớn ...
OutOfMemoryError
và giữ lại một tham chiếu đến nó. Nó truyền đạt rằng việc bắt một OutOfMemoryError
không hữu ích như người ta nghĩ, bởi vì bạn có thể đảm bảo hầu như không có gì về trạng thái của chương trình của bạn khi bắt nó. Xem stackoverflow.com/questions/8728866/