ฉันทราบว่าวัตถุทุกชิ้นต้องการหน่วยความจำฮีปและการอ้างอิงดั้งเดิมบนสแต็กทั้งหมดต้องใช้หน่วยความจำสแต็ก
เมื่อฉันพยายามที่จะสร้างวัตถุบนกองและมีหน่วยความจำไม่เพียงพอที่จะทำเช่นนั้น 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/…