Java 응용 프로그램이 SIGSEGV 및 스택 데이터 덤프 및 텍스트 파일의 정보로드로 정기적으로 충돌하기 시작했습니다.코드를 실행할 때 JVM에서 발생하는 Segfaults를 어떻게 디버깅합니까?
gdb에서 C 프로그램을 디버깅했으며 IDE에서 Java 코드를 디버깅했습니다. 실행중인 Java 프로그램에서 C와 유사한 충돌에 접근하는 방법을 잘 모르겠습니다.
여기서 JVM 버그를보고 있지 않다고 가정합니다. 다른 Java 프로그램도 정상적으로 작동하며 Sun의 JVM은 내 코드보다 안정적입니다. 그러나 Java 코드로 segfaults를 발생시킬 수도 있습니다. 사용할 수있는 메모리가 충분하고 프로필러를 마지막으로 체크인했을 때 힙 사용량은 약 50 %였으며 때로는 스파이크가 약 80 % 정도였습니다. 조사 할 수있는 시작 매개 변수가 있습니까? 이와 같은 버그에 접근 할 때 좋은 체크리스트는 무엇입니까?
이벤트를 신뢰할 수있게 재현 할 수는 없지만 무작위로 발생하는 것으로 보이지는 않으므로 테스트가 완전히 불가능하지는 않습니다.
ETA :. 실제 문제는 매우 구체적으로 수 있으므로
(나는 일반적인 접근 방법을 찾고 있어요 피투성이의 세부 사항 중 일부는 아직도이 이미 수집 된 몇 가지 정보입니다 그것은이 될 수 있습니다 얼마 전, 나는 내 CI 서버 (자세한 내용은 here 참조) 업그레이드 한 후 유사한 보이는 문제가 있었다
일부 값입니다.)하지만,() -XX:MaxPermSize
설정이 수정이 시간이 도움이되지 않았다.
추가 조사에 따르면 "현재 스레드"로 표시된 스레드는 절대로 내 스레드 중 하나가 아니며 "VMThread"또는 "GCTaskThread"중 하나라고합니다. 후자이므로 추가로 "(종료됨)"주석이 표시된 경우, 이전의 경우 GCTaskThread가 목록에 없습니다. 이 문제는 GC 작업이 끝날 무렵에 발생할 수 있다고 생각합니다.
스택 추적을 얻을 수 있습니까? 같은 장소에서 SEGV입니까? 우리는 더 많은 정보를 얻을 수 있을까요? –
응용 프로그램에 원시 코드가 있습니까? JVM이 바이트 코드의 수집을 허용한다면, 바이트 코드가 얼마나 버그가 있더라도 segfault를 유발할 수 있습니다. 사실, JVM (또는 JRE) 버그를 확인하고 있습니다. –
@Ed - 스택 트레이스는 많이 있지만 텍스트의 거대한 벽입니다. 어떤 부분을 게시하는 것이 가장 유용할까요? 저는이 문제 유형에 접근하는 일반적인 방법을 주로 찾고 있습니다. 그러므로 여기에 매우 구체적인 정보를 쏟아 부어 주저합니다. –