2011-01-11 5 views
40

내 응용 프로그램 로그 (log4j 사용)에서 스택 추적없이 NullPointerException이 표시됩니다. 최적화로, 예외가 여러 번 발생할 때 - jvm이 스택 추적을 생성하지 않는다는 것을 알고 있습니다. 문제는 얼마 전에 예외가 발생하고 모든 로그가 스택 추적없이 예외로 채워집니다. 이 메커니즘을 "다시 설정"하는 방법이 있습니까? 그러면 다음에 던져 질 예외가 전체 스택 추적과 함께 인쇄됩니까? 이 버그를 재현하기가 어려우므로 응용 프로그램을 다시 시작하고 싶지는 않습니다. 다시 시작하면 "사라집니다"...스택 추적이없는 반복 예외 - 재설정 방법은 무엇입니까?

감사합니다!

+1

"최적화로, 예외가 여러 번 발생하는 경우 - jvm이 스택 추적을 중단합니다." 이걸 어떻게 알지? 그것은 사실이 아닙니다. – skaffman

+0

catch 블록 때문에 예외의 원인 만 기록됩니다. –

+3

예. 일종의 최적화입니다. @dogbane의 대답을 참조하십시오. @지가 - 로깅과 관련이 없으며 예외 자체에 스택 추적이 없습니다. – duduamar

답변

66

다음 JVM 속성을 실행 해 다음 Release Notes에서

-XX:-OmitStackTraceInFastThrow 

:

VM 지금 모든 "콜드" 에 대한 올바른 스택 백 트레이스를 제공하는 서버에서 컴파일러 내장 예외. 성능 목적을 위해 예외가 몇 번 발생하면 메서드를 다시 컴파일 할 수 있습니다. 재 컴파일 후에, 컴파일러는 트레이스를 제공하지 않는 예외를 사전 할당 된 을 사용하여보다 빠른 전술 인 을 선택할 수 있습니다. 미리 할당 된 예외를 완전히 사용하지 않으려면 새 플래그 -XX:-OmitStackTraceInFastThrow을 사용하십시오.

+2

감사합니다. 실행중인 java 프로세스에서이 플래그를 즉시 활성화 할 수 있습니까? – duduamar

+0

@duduamar 확실하지는 않지만 나는 추측 할 수 없다고 생각합니다. – dogbane

+1

@duduamar : 런타임시이 플래그를 변경하기위한 공개 티켓이 있습니다. [JDK-8046503 - OmitStackTraceInFastThrow 카운터 재설정 기능] (https://bugs.openjdk.java.net/browse/JDK-8046503). 그래도 아직 열어. – sleske

관련 문제