>  기사  >  Java  >  JDK 도구인 jstack을 사용하여 런타임 프로그램 교착 상태의 원인을 찾아보세요.

JDK 도구인 jstack을 사용하여 런타임 프로그램 교착 상태의 원인을 찾아보세요.

不言
不言앞으로
2018-10-24 11:06:282122검색

이 글의 내용은 JDK 도구인 jstack을 사용하여 런타임 프로그램 교착 상태의 원인을 찾는 내용입니다. 필요한 참고 자료가 있으면 도움이 될 것입니다.

Java 멀티 스레드 프로그래밍은 Java 인터뷰에서도 자주 검토되는 내용입니다. Java 다중 스레드 프로그래밍을 처음 접하는 친구는 실수로 교착 상태를 일으킬 수 있는 일부 응용 프로그램을 작성할 수 있습니다. Java 멀티스레딩의 원인을 분석하는 방법은 무엇입니까? 교착 상태를 일으킬 것으로 의심되는 명령문에 대해 중단점과 단일 단계 디버깅을 설정했지만 재현할 수 없는 경우가 많습니다. 단일 단계 디버깅과 프로그램 직접 실행 사이의 코드 실행 타이밍이 다르고 교착 상태의 트리거 조건이 충족되지 않을 수 있기 때문에 이러한 현상은 정상적인 현상입니다.

JDK 도구인 jstack을 사용하여 런타임 프로그램 교착 상태의 원인을 찾아보세요.

실제로 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:

JDK 도구인 jstack을 사용하여 런타임 프로그램 교착 상태의 원인을 찾아보세요.

임을 알 수 있습니다. 그런 다음 명령줄 jstack 51476을 사용하여 이 프로세스의 실행 중인 스택 정보를 인쇄합니다.

JDK 도구인 jstack을 사용하여 런타임 프로그램 교착 상태의 원인을 찾아보세요.

위 그림에서 빨간색으로 강조 표시된 0x00000000d6f64988 및 0x00000000d6f649b8은 코드에서 "ABAP" 및 "Java" 두 리소스를 나타냅니다.

jstack에 의해 인쇄된 출력은 매우 명확하며, 어떤 Java 코드 줄이 어떤 Java 리소스(아래 그림에서 잠금 대기 중)를 잠그려고 시도했지만 실패했는지, 그리고 실패 이유, 즉 스레드 이름을 보여줍니다. 현재 요청된 리소스를 소유한 리소스도 인쇄됩니다.

JDK 도구인 jstack을 사용하여 런타임 프로그램 교착 상태의 원인을 찾아보세요.

JStack을 사용하면 Java 프로그래머는 더 이상 길고 머리를 소모하게 만드는 다중 스레드 코드에 대해 어렵게 생각할 필요가 없습니다. JDK는 교착 상태의 원인을 자동으로 인쇄하므로 매우 편리합니다.

위 내용은 JDK 도구인 jstack을 사용하여 런타임 프로그램 교착 상태의 원인을 찾아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제