Her nesnenin yığın bellek gerektirdiğinin ve yığın üzerindeki her ilkel / referansın yığın bellek gerektirdiğinin farkındayım.
Öbek üzerinde bir nesne oluşturmaya çalıştığımda ve bunu yapmak için yeterli bellek olmadığında, JVM öbek üzerinde bir java.lang.OutOfMemoryError oluşturur ve bana atar.
Örtük olarak, bu, başlangıçta JVM tarafından ayrılmış bir bellek olduğu anlamına gelir.
Bu ayrılmış bellek kullanıldığında (kesinlikle tükenir, aşağıdaki tartışmayı okur) ve JVM'nin yığın üzerinde java.lang.OutOfMemoryError örneği oluşturmak için yeterli belleği yoksa ne olur ?
Sadece asıyor mu? Yoksa bir OOM örneğinin null
hafızası olmadığından beni atar new
mıydı?
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 neden yeterli hafıza ayıramadı?
Ne kadar bellek ayrılmış olursa olsun, JVM'nin bu belleği "geri almanın" bir yolu yoksa, o belleğin kullanılması hala mümkündür:
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
}
}
}
}
}
}
Veya daha kısaca:
private void OnOOM(java.lang.OutOfMemoryError e) {
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e2) {
OnOOM(e2);
}
}
OutOfMemoryException
ve daha sonra büyük bir tampon oluşturmayı içeren bir şey
OutOfMemoryError
ve ona bir referansı koruduğunda gerçekleşebilir. Bir programın yakalanmasının OutOfMemoryError
düşündüğünüz kadar yararlı olmadığını söyler , çünkü programınızın yakalanmasıyla ilgili durumu hakkında neredeyse hiçbir şeyi garanti edemezsiniz . Bkz. Stackoverflow.com/questions/8728866/…