모든 객체에는 힙 메모리가 필요하고 스택의 모든 기본 / 참조에는 스택 메모리가 필요하다는 것을 알고 있습니다.
힙에 객체를 만들려고하는데 메모리가 충분하지 않으면 JVM 이 힙에 java.lang.OutOfMemoryError 를 생성 하여 나에게 던집니다.
따라서 암시 적으로 이것은 시작시 JVM이 예약 한 일부 메모리가 있음을 의미합니다.
이 예약 된 메모리가 모두 사용되면 (아래에서 논의 내용을 읽음) JVM에 java.lang.OutOfMemoryError 인스턴스를 작성하기에 충분한 메모리가 힙에없는 경우 어떻게됩니까?
그냥 걸어 요? 아니면 OOM 인스턴스에 null
대한 기억이 없기 때문에 그는 나를 던질 것 new
입니까?
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/...