2009-12-11 5 views
8

java.lang.OutOfMemoryError : Java 힙 공간 예외는 발생하지만 try/catch 블록은 오류를 catch하지 않는 Java 웹 응용 프로그램에 스레드가 있습니다."java.lang.OutOfMemoryError : Java 힙 공간"이 잡히지 않는 이유는 무엇입니까?

샘플 코드 :

private void doSomeWork() 
{ 
    try 
    { 
     processData(); //Causes OutOfMemoryError 
     System.out.println("This line does not execute"); 
    } 
    catch (Exception e) 
    { 
     System.out.println("Exception. This line does not execute."); 
     //Log error 
    } 
    finally 
    { 
     System.out.println("finally. This line does execute"); 
     System.out.println("Thread name: " + Thread.currentThread().getName()); 

    } 
} 

출력 :

 
finally. This line does execute 
Thread name: _Worker-8 
Exception in thread "_Worker-8" java.lang.OutOfMemoryError: Java heap space 
...

배경 :

내가 최근에 자바 프로젝트를 인수 내가 일어나려고 Java 및이 프로젝트를 빠르게 진행할 수 있습니다. 나는 C# 개발자이기 때문에 아직이 프로젝트 나 Java에 익숙하지 않습니다. -Xmx 설정을 사용하여 오류를 수정할 수 있음을 알고 있지만이 오류를 잡아 내서 기록 할 수 있습니다. 오류가 모든 로그 파일에 나타나지 않고 Eclipse의 디버그 모드에서 콘솔에 출력이 표시됩니다.

답변

39

OutOfMemoryErrorError이므로 Exception이 아닙니다. OutOfMemoryErrorException의 하위 클래스가 아니므로 catch (Exception e)은 적용되지 않습니다.

OutOfMemoryErrorThrowable으로 확장되었으므로 잡을 수 있어야합니다. 여기에 SO discussion이 있는데, 언제라도 오류를 잡아야합니다. 일반적으로 아무 것도 할 수 없으므로 프로덕션 코드에서 오류를 포착하는 것이 좋습니다. 그러나 무슨 일이 일어나고 있는지 디버그하려고하는 특별한 경우를 생각해 보면 도움이 될 것입니다.

+0

좋은 답변과 링크를 참조하십시오. 고마워, 고마워! – Crispy

+2

응용 프로그램의 가장 바깥 쪽 부분 (또는 스레드 메서드의 가장 바깥 쪽 부분)에 catchable throwable을 사용하여 프로그램이 중단 된 이유를 실제로 알 수 있습니다 (아무 것도없는 경우).). –

3

"~ 오류"는 "~ 예외"가 아닙니다.

당신은 예외가 직접하는 Throwable를 확장하면서

2

OutOfMemoryError가이 않는 VirtualMachineError를 확장 "오류"또는 "의 Throwable"를 캐치해야합니다. 따라서 Java 사양에 따라 잡히지 않습니다. 모든 예외를 잡으려고하는 경우 catch (Throwable e)를 조항에 추가하면됩니다.

+0

이 더 정확하려면 OutOfMemoryError는 Error를 확장하는 VirtualMachineError를 확장하고 오류가 예외가 아니기 때문에 catch (Exception)가 catch를 catch 할 수 없습니다. – chburd

+0

Bingo. 전체 나무를 나열하는 생각하지만 게으른있어 :) – Daniil

11

java.lang.OutOfMemoryError는 java.lang.Exception을 확장하지 않으므로 Exception이 아닙니다. OutOfMemoryError는 java.lang.Error를 상속합니다. 당신이 잡을하려는 경우 오류가 이것을 시도 :

private void doSomeWork() 
{ 
    try 
    { 
     processData(); //Causes OutOfMemoryError 
     System.out.println("This line does not execute"); 
    } 
    catch (Error e) 
    { 
     System.out.println("Exception. This line does not execute."); 
     //Log error 
    } 
    finally 
    { 
     System.out.println("finally. This line does execute"); 
     System.out.println("Thread name: " + Thread.currentThread().getName()); 

    } 
} 

참고 : 당신은 당신이 또한 모두를 잡으려고 Throwable를 사용할 수 있도록 예외와 오류가 Throwable를 확장합니다.

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Throwable.html

0

당신으로 아무것도 누수가 적어도 문제를 기록하고 어쩌면 몇 가지 정리를 할 기회가 있다면, 그래서 나는 보통 스레드에 '있던 uncaughtExceptionHandler'를 추가한다 무엇을 할 것.