Java 소프트웨어를 사용하는 동안 때때로 이상한 문제가 불가피하게 발생합니다. 이러한 문제는 종종 로그 정보를 사용하여 찾을 수 없습니다. 현재 프로세스 내부의 스레드의 스택 호출 관계를 확인하여 문제를 분석해야합니다.
예를 들어, 작업을 수행 할 때는 여러 경고 상자가 설명 할 수 없을 정도로 나타납니다. 일부는 정상이며 일부는 그렇지 않습니다. 이러한 오류 경고 메시지의 경우 위치의 오류 팝업 상자가있는 코드를 어떻게 찾아야합니까? 팝업 상자 다음에 소프트웨어의 다양한 스레드를보고 문제를 일으키는 스레드를 찾아야합니다. 그러나 때로는 환경, 시간 및 기타 문제로 인해 IDE를 사용하여 디버그 할 수 없습니다. 도구 소프트웨어를 통해서만 메모리 스냅 샷을 가져온 다음 메모리 정보를 분석 할 수 있습니다.
오늘 저는 일반적으로 사용되는 도구 인 Jstack을 소개합니다
JSTACK은 JDK와 함께 제공되는 도구이며 JVM 성능 튜닝에서 모양이 매우 높은 소프트웨어이기도합니다. 따라서 마스터해야합니다.
JSTACK은 JVM 시점의 현재 지점의 스레드 스냅 샷을 생성 할 수 있습니다.
스레드 스냅 샷은 현재 JVM의 각 스레드가 실행되는 메소드 스택 모음입니다. 스레드 스냅 샷을 생성하는 주된 이유 :
1. 스레드 간의 교착 상태, 데드 루프 및 외부 리소스를 요청하여 발생하는 장기 대기와 같은 스레드 스냅 샷을 통한 스레드의 장기 일시 정지 이유.
2. 스레드 스냅 샷을 통해 예외 정보 소스를 결정하여 현재 실행 방법의 통화 관계에 대한 분석.
사용하는 것은 매우 간단합니다.
(PS : 전제는 이미 Jstack과 JDK를 가지고 있다는 것입니다. 환경 변수를 설정하는 것이 가장 좋습니다.)
1 단계 : Windows Task Manager를 통해 프로세스의 PID보기
여기서 우리는 PID가 무엇인지 간단히 이야기합니다. PID는 각 프로세스의 정체성입니다. 소프트웨어가 시작된 후 프로세스의 신원을 식별하기 위해 운영 체제가 할당 한 고유 한 신원입니다.
그림처럼
프로세스 탭에서보기> 열을 선택하십시오
PID를 확인하고 확인하십시오
응용 프로그램 탭으로 전환하고 스냅 샷 메모리로 프로그램을 선택하십시오. 선택된 이미지는 Android Studio입니다. 마우스 오른쪽 버튼을 클릭하여 처리하십시오.
여기서 우리는 Android Studio의 해당 PID가 9952임을 알 수 있습니다.
두 번째 단계는 명령 줄을 열고 Jstack 프로그램을 실행하는 것입니다.
환경 변수가 성공적으로 추가되지 않으면 JSTACK 경로에서만 실행할 수 있습니다. 그렇지 않으면 운영 체제가이를 인식하지 못합니다.
그림과 같이, 여기에는 일반적으로 메모리 스냅 샷을 가져 오는 데 사용되는 두 가지 작동 매개 변수가 있습니다.
그들의 의미는 다음과 같습니다.
-L 긴 목록은 추가 잠금 정보를 인쇄합니다. 교착 상태가 발생하면 jstack -l pid를 사용하여 잠금 상태를 관찰 할 수 있습니다.
-M 혼합 모드, 출력 Java 스택 정보뿐만 아니라 C/C ++ 스택 정보 (기본 메소드)도 출력합니다.
우리는 일반적으로 -L 매개 변수를 사용하여 요구를 충족합니다.
형식은 다음과 같습니다. jstack -l pid >> 123.txt
PS 참고 여기 >>이란 리디렉션을 의미합니다. 즉, 캡처 된 스냅 샷을 987.txt로 출력합니다. >> 두 번 때 공간을 유지하는 것이 가장 좋습니다.
이러한 방식으로 명령 줄 경로에서 987.txt 파일을 생성하고 동시에 메모리 스냅 샷을이 텍스트에 작성합니다.
아래 그림과 같이 :