이 글의 내용은 JDK 도구인 jstack을 사용하여 런타임 프로그램 교착 상태의 원인을 찾는 내용입니다. 필요한 참고 자료가 있으면 도움이 될 것입니다.
Java 멀티 스레드 프로그래밍은 Java 인터뷰에서도 자주 검토되는 내용입니다. Java 다중 스레드 프로그래밍을 처음 접하는 친구는 실수로 교착 상태를 일으킬 수 있는 일부 응용 프로그램을 작성할 수 있습니다. Java 멀티스레딩의 원인을 분석하는 방법은 무엇입니까? 교착 상태를 일으킬 것으로 의심되는 명령문에 대해 중단점과 단일 단계 디버깅을 설정했지만 재현할 수 없는 경우가 많습니다. 단일 단계 디버깅과 프로그램 직접 실행 사이의 코드 실행 타이밍이 다르고 교착 상태의 트리거 조건이 충족되지 않을 수 있기 때문에 이러한 현상은 정상적인 현상입니다.
실제로 JDK는 교착 상태에 있는 실행 중인 애플리케이션을 직접 분석하고 이를 유발한 특정 Java 코드 줄을 제공할 수 있는 강력한 교착 상태 분석 도구를 Java 프로그래머에게 제공했습니다.
이 문서에서는 예제를 사용하여 JDK에서 제공하는 표준 도구를 사용하는 방법을 보여줍니다.
이 도구는 jstack이라고 하며 JDK 설치 디렉터리의 bin 폴더에 있는 실행 파일입니다.
먼저 교착상태를 일으킬 애플리케이션을 작성합니다.
public class DeadLockExample { public static void main(String[] args) { final String resource1 = "ABAP"; final String resource2 = "Java"; Thread t1 = new Thread() { public void run() { synchronized (resource1) { System.out.println("Thread 1: locked resource 1"); try { Thread.sleep(100); } catch (Exception e) { } synchronized (resource2) { System.out.println("Thread 1: locked resource 2"); } } } } ; Thread t2 = new Thread() { public void run() { synchronized (resource2) { System.out.println("Thread 2: locked resource 2"); try { Thread.sleep(100); } catch (Exception e) { } synchronized (resource1) { System.out.println("Thread 2: locked resource 1"); } } } } ; t1.start(); t2.start(); } }
이 애플리케이션 아이디어는 매우 간단합니다. 동시에 두 개의 스레드를 시작하고, 리소스1과 리소스2를 각각 잠근 다음, 0.1초 동안 대기한 다음, 각각 리소스2와 리소스1을 요청하려고 합니다.
애플리케이션을 실행하고 콘솔에 다음 출력을 인쇄한 후 교착 상태에 들어갑니다.
Thread 1: 잠긴 리소스 1
Thread 2: 잠긴 리소스 2
명령줄 jps -l -m을 사용하여 교착 상태를 찾습니다. state 애플리케이션의 프로세스 ID입니다. 아래 그림에서 교착 상태 프로세스가 51476:
임을 알 수 있습니다. 그런 다음 명령줄 jstack 51476을 사용하여 이 프로세스의 실행 중인 스택 정보를 인쇄합니다.
위 그림에서 빨간색으로 강조 표시된 0x00000000d6f64988 및 0x00000000d6f649b8은 코드에서 "ABAP" 및 "Java" 두 리소스를 나타냅니다.
jstack에 의해 인쇄된 출력은 매우 명확하며, 어떤 Java 코드 줄이 어떤 Java 리소스(아래 그림에서 잠금 대기 중)를 잠그려고 시도했지만 실패했는지, 그리고 실패 이유, 즉 스레드 이름을 보여줍니다. 현재 요청된 리소스를 소유한 리소스도 인쇄됩니다.
JStack을 사용하면 Java 프로그래머는 더 이상 길고 머리를 소모하게 만드는 다중 스레드 코드에 대해 어렵게 생각할 필요가 없습니다. JDK는 교착 상태의 원인을 자동으로 인쇄하므로 매우 편리합니다.
위 내용은 JDK 도구인 jstack을 사용하여 런타임 프로그램 교착 상태의 원인을 찾아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!