나는 그것이 아니라고 생각했지만 어제 나는 그것을해야했습니다. Akka (JVM의 액터 시스템 구현)를 사용하여 비동기 작업을 처리 하는 응용 프로그램입니다 . 배우 중 한 명이 PDF 조작을 수행하고 라이브러리가 버그이기 때문에 가끔씩 죽습니다 StackOverflowError
.
두 번째 측면은 Akka가 JVM 치명적 오류 (예 : StackOverflowError)가 발견되면 전체 액터 시스템을 종료하도록 구성되어 있다는 것입니다.
세 번째 측면은이 액터 시스템이 웹 앱 내에 내장되어 (WTF- 레거시, 레거시, 이유) 액터 시스템이 종료 될 때 웹 앱은 그렇지 않다는 것입니다. 결과적으로 StackOverflowError
작업 처리 응용 프로그램에서 빈 웹 응용 프로그램이됩니다.
빠른 수정으로 StackOverflowError
액터 시스템의 스레드 풀이 끊어지지 않도록 던져지는 것을 잡아야 했습니다. 이것은 아마도 이런 상황에서 특히 그러한 오류를 잡는 것이 때때로 괜찮을 것이라고 생각하게합니다. 임의의 작업을 처리하는 스레드 풀이있는 경우 달리 응용 프로그램이 일관성이없는 상태를 유지할 수있는 OutOfMemoryError
방법을 상상할 수 없습니다 StackOverflowError
. 이러한 오류 후에 스택이 지워 지므로 계산이 정상적으로 진행될 수 있습니다. 그러나 아마도 중요한 것이 빠져있을 것입니다.
또한, 나는 처음에 오류를 고치기위한 모든 것입니다 (사실 며칠 전에이 동일한 응용 프로그램에서 SOE를 이미 수정했습니다). 그러나 이것이 언제인지는 정말로 알지 못합니다. 상황이 발생할 수 있습니다.
를 잡는 대신 JVM 프로세스를 다시 시작하고 StackOverflowError
해당 작업을 실패한 것으로 표시 한 다음 내 비즈니스를 계속 하는 것이 더 좋은 이유는 무엇 입니까?
공기업을 절대로 사로 잡을만한 이유가 있습니까? 나에게 아무 것도 알려주지 않는 모호한 용어 인 "모범 사례"를 제외하고.
StackOverflowException
일반적으로 종료되지 않는 메소드 호출 체인으로 인해 발생합니다. 스택 공간을 늘리면 새 스레드의 메모리 비용이 증가하지 않습니다.
:-)