JVM은 당신이 발생할 때 VM은 스택 트레이스를 저장하기 위해 메모리를 할당해야하기 때문에 (메모리를 저장 아마, 예외 또는 오류의 스택 추적에 가질 수 1,024 항목의 인공 제한이).
다행히도이 제한을 늘릴 수있는 플래그가 있습니다.다음 인수를 사용하여 프로그램을 실행하십시오.
-XX:MaxJavaStackTraceDepth=1000000
이렇게하면 스택 추적을 최대 100 만 개까지 인쇄 할 수 있습니다. 항목 수를 무제한으로 설정하려면이 값을 -1
으로 설정할 수도 있습니다.
This list of non-standard JVM options은 더 자세한 정보를 제공합니다
맥스. 아니. Java 예외에 대한 스택 추적의 행 수 (0은 모두를 나타냄). Java> 1.6 인 경우 값 0은 실제로 모든 값 ( 1.6.0_22, Windows에서 1.7.0으로 테스트 됨)을 인쇄하려면 0 값 -1 또는 모든 음수를 지정해야 함을 의미합니다. Java < = 1.5이면 값 0은 모든 것을 의미합니다. 음수의 JVM 쵸크 ( Windows에서 1.5.0_22로 테스트 됨). 이 플래그와 질문의 샘플을 실행
는
다음과 같은 결과 제공 :
Exception in thread "main" java.lang.StackOverflowError
at Overflow.<init>(Overflow.java:3)
at Overflow.<init>(Overflow.java:4)
at Overflow.<init>(Overflow.java:4)
at Overflow.<init>(Overflow.java:4)
(more than ten thousand lines later:)
at Overflow.<init>(Overflow.java:4)
at Overflow.<init>(Overflow.java:4)
at Overflow.a(Overflow.java:7)
at Overflow.main(Overflow.java:10)
이 방법은, 당신이 오류를 던졌다 코드의 원래 발신자를 찾을 수 있습니다, 심지어 실제 스택 추적 경우 1024 행 이상입니다.
이 옵션을 사용할 수 없으면 이와 같은 재귀 함수를 사용하고 수정할 수있는 경우 다른 방법이 있습니다. 다음과 같은 시도 - 캐치 추가하는 경우 : 기본적으로
public Overflow() {
try {
new Overflow();
}
catch(StackOverflowError e) {
StackTraceElement[] stackTrace = e.getStackTrace();
// if the stack trace length is at the limit , throw a new StackOverflowError, which will have one entry less in it.
if (stackTrace.length == 1024) {
throw new StackOverflowError();
}
throw e; // if it is small enough, just rethrow it.
}
}
을,이 생성되며, 각각은 이전에 비해 한 단계 위로를 보낼 수 있기 때문에 마지막 항목을 버리고, 새로운 StackOverflowError
을 던져 (이것은 걸릴 수 있습니다 이 모든 오류가 만들어지기 때문에 몇 초가 걸립니다. 스택 추적이 1023 개 요소로 줄어들면 간단히 다시 throw됩니다.
궁극적으로 스택 추적의 맨 아래에 1023 개의 줄이 인쇄됩니다. 스택 추적은 전체 스택 추적이 아니지만 아마도 가장 유용한 부분입니다.
스택 크기를 늘릴 수 있고 없어지면 스택 크기를 줄이고 더 많은 스택 추적을 볼 수 있는지 알아 볼 수 있습니까? JVM에서 스택 크기를 제어하는 방법과 충분히 작게 만들 수 있는지 여부는 기억이 나지 않지만 문제를 진단하는 데 도움이 될 수 있습니다. –
@Tom, 스택 크기는 새로운'Thread (ThreadGroup group, Runnable target, String name, long stackSize)'에 의해 제어됩니다. – bestsss
오 잘. 좋은 생각 :-( –