2012-01-04 6 views
12

저는 C++에서 Java로 왔습니다. C++ 세계에서 우리는 예외 안전에주의를 기울이고 돌연변이 자 자체에 의해 던져진 예외 나 그것이 위임하는 메소드 (최소, 강하며, no-throw)에 던져진 예외에도 불구하고 뮤 테이터가 다른 보장을 제공 할 수 있음에 주목하십시오. 강력한 예외 보장이있는 메소드를 구현하려면 일부 기본 연산이 절대로 예외를 발생시키지 않아야합니다. JLS에서는 어느 조작이 어떤 종류의 예외를 throw 할 수 있는지에 관한 명령문을 작성하지만 VirtualMachineError 오류는 문제점을 나타냅니다. JLS Quoth :No-throw VirtualMachineError 보장

내부 오류 또는 자원 제한은 자바 프로그래밍 언어 의 의미를 구현하여 Java 가상 머신 방지; 이 경우 하위 클래스 인 VirtualMachineError의 인스턴스가 발생합니다.

JLS는 VirtualMachineError에 대해 더 이상 말하지 않습니다. "내부 오류"는 JVM의 버그를 의미하므로이 경우에는별로 관심이 없습니다. JVM의 버그에도 불구하고 모든 배팅은 해제되어 있습니다. 그러나 "자원 제한"의 경우는 어떻습니까? 자원 제한으로 인해 절대로 작동하지 않을 것이라는 보장이있는 작업이 있습니까? Java Virtual Machine Specification Quoth

+0

답변에 가장 가까운 것은'try {...} catch (Throwable t) {}'입니다. 물론 메모리가 없어지면 어떤 연속성도 거의 불가능할 것입니다. 이제는 C++과 다르지 않습니다. –

+2

나는 내 자신의 질문에 대답하고있다. FAQ도이 점을 강조합니다. – Raedwald

답변

12

:이 사양은 내부 오류 또는 자원 한계가 발생 될 수있다 예측할 수 이 그들이보고 할 때 정확하게 강제하지 않는

. 따라서, 아래 정의 VirtualMachineError 서브 임의의 Java 가상 머신의 동작 중 언제든지 발생 될 수

자바에서 예외 보장이 VirtualMachineError 예외에 대하여 이루어지지 할 수 있으므로 . 모든 예외 보장은 "... VirtualMachineError이 던져지면 자격이 없습니다"라는 조건을 따라야합니다. 이것은 Java가 C++과 다른 방식 중 하나입니다.

이것은 또한 VirtualMachineError 예외를 포착하는 데 많은 요점이 없음을 나타냅니다. 이는 프로그램이 throw 된 경우 정의되지 않은 상태에 있기 때문입니다. 불행히도 예외는 OutOfMemoryError입니다. 불행한 점은 여러 작업 중 하나가 너무 많은 메모리를 필요로하기 때문에 실패 할 경우 다른 작업을 계속 진행할 수 있기 때문입니다.

+0

당신은 당신 자신의 질문에 대답하고 있습니까? – skaffman

+1

나는 내 자신의 질문에 대답하고있다. – Raedwald

+0

VirtualMachineError 및 OutOfMemoryError 모두 오류입니다. 충돌이 아니라 Java는 일부 비정상적인 상황에서 오류를 발생시킵니다. 즉, 대부분의 프로그램에서 오류 하위 클래스를 발견하지 못했습니다. 오류는 예외와 구별 될 수 있습니다. Herb Sutter가 승격 한 예외 보장은 일반적인 예외에 대해서도 Java에 적용될 수 있습니다. –

1

자원 제한 인 경우, 처음에는 아무 작업도 수행되지 않습니다. 다음은 VirtualMachineError가있는 완벽한 예제 링크입니다. Virtual machine error

이 오류는 OutofMemoryError와 같지 않습니다.이 오류는 그때까지 일부 작업이 진행 중일 수 있습니다.

+0

" 아무런 작업도 일어나지 않습니다. " 그것은 "강력한 예외 보증"이 될 것입니다. 그러나 그런 보증은하지 않습니다. – Raedwald

+0

위의 예를 기반으로 해석이 정확하다면 VM을 시작하기 전에 -Xmx 매개 변수와 같은 정의 된 리소스를 확인 중이며 정의 된 메모리 크기를 찾지 못하고 오류를 throw 할 수 없습니다. 나는 보증이 이루어지지 않았다는 당신의 견해에 동의하지만 왜 그런지는 모릅니다. – kosa

1

나는 당신이 당신 자신의 질문에 답했고, 이것이 왜 당신에게 다소 놀랄만한지, 나는 엄격한 C++ 배경에서 왔는지 이해할 수있다. 이것은 관리되는 메모리 (가상) 머신의 현실이며 java에 국한되지 않습니다. JVM은 사용할 수있는 힙 (Java 명령 줄에서 구성 가능)의 양이 제한되어 있으므로 메모리가 부족할 수 있습니다.

C++/기계 코드 세계에서 다소 비슷하지만 동일하지는 않지만 할당되지 않았거나 할당되지 않은 메모리를 주소 지정하려고 할 때 GENERAL_PROTECTION_FAULT (* NIX이면 SEGMENTATION_FAULT)가됩니다. 가상 주소 공간 외부.그 시나리오에 직면하여 "강력한 예외 보장"을 제공하는 것은 코드의 버그이거나 프로그램의 통제 밖에있을 수 있기 때문에 똑같이 어렵습니다.

+0

SEGV는 프로그램의 버그를 나타냅니다. Java에서의 유추는'NullPointerException'입니다. – Raedwald

+0

이것이 관리되는 가상 컴퓨터의 일반적인 기능인 것은 아닙니다. JVMS를 사용하면'new'를 사용하지 않거나 클래스를로드하려고 할 때에도 OutOfMemoryError가 발생합니다. – Raedwald

+0

@Raedwald 'null'을 참조하려고 할 때만 NPE를 얻을 수 있습니다. 더 많은 메모리를 할당하려고 시도한 후에 (또는 수행하는 메소드 호출) GC가 실행되고 충분한 메모리가 해제되지 않은 경우에만 OutOfMemoryError가 발생합니다. –

0

자바에서는 언제든지 Thread.stop() 또는 stop (Throwable)을 호출 할 수 있습니다. 대부분의 오류는 매우 중요한 것으로 간주되므로 수행중인 작업을 실제로 알지 못하면 오류를 처리하지 않아야합니다.

12 년 동안 서버 측 Java 응용 프로그램을 개발 한 결과 임의의 예외에 대해 걱정하는 사람은 들어 본 적이 없다고 말할 수 있습니다. 자바에 대해 걱정할 필요가있는 문제는 아닌 것 같습니다.

문제를 해결할 다른 방법이있을 수 있으므로 보증이 필요한 이유를 보여주는 예를 들려 줄 수 있습니까?

+2

'OutOfMemoryError' 예외가 가장 흥미로운 경우입니다. 내 자신의 대답으로 말했듯이 : 불행한 점은 너무 많은 메모리가 필요하기 때문에 여러 작업 중 하나가 실패하면 다른 작업을 계속 진행할 수 있기 때문입니다. 그러나 JVM이'OutOfMemoryError'를 던질 수 있다면'OutOfMemoryError'를 잡을 때 유효한 상태에있는 프로그램에 의존 할 수 없습니다. 이것은 try-catch-discard 접근법을 신뢰할 수 없게 만듭니다. – Raedwald

+0

"처리를 시도하기 전에"누락 된 "NOT"을 추가했습니다. –

+2

@ Raedwald OOME을 버리는 것이 신뢰할 수 없다는 것이 맞습니다.당신이해야 할 일은 전체 JVM이 (단지 소프트 한도가 아니라) 실패 할 것으로 예상되는 최대 메모리를 정의하고 얼마나 많은 메모리를 사용했는지 모르기 때문에 실패 할 수있는 작업을 수행하는 것을 피하는 것입니다. 더 나쁜 경우에는 필요에 따라 다시 시작할 수있는 별도의 프로세스를 사용해야합니다. (이것은 또한 JNI 라이브러리의 버그를 막아줍니다.) –