Java 애플리케이션, 특히 프로덕션 환경에서 실행되는 애플리케이션은 추적하기 어려울 수 있는 성능 병목 현상, 교착 상태 및 메모리 누수를 유발할 수 있습니다. 이러한 문제가 발생하는 경우 애플리케이션을 원활하게 실행하고 긍정적인 사용자 경험을 유지하려면 빠르고 효과적인 디버깅이 필수적입니다. VisualVM과 JStack이 Java 개발자에게 귀중한 도구가 되는 곳입니다.
강력한 프로파일링 및 모니터링 기능을 갖춘VisualVM과 상세한 스레드 덤프를 제공하는 jstack은 개발자가 용이합니다.
교착 상태를 진단하고 해결하는 것은 특히 고성능 애플리케이션에서 매우 중요합니다. 이 가이드에서는 두 가지 강력한 Java 도구인 VisualVM 및 jstack을 사용하여 교착 상태를 감지하고 스레드 덤프를 얻는 방법을 살펴봅니다.
도구에 대해 자세히 알아보기 전에 몇 가지 기본 사항을 명확히 하겠습니다.
교착 상태
: 스레드가 서로 리소스를 해제하기를 기다리는 상황으로 인해 무한한 차단 주기가 발생합니다.스레드 덤프
: 상태 및 보류 중이거나 대기 중인 잠금에 대한 세부 정보를 포함하여 특정 시간에 Java 애플리케이션 내 활성 스레드의 스냅샷입니다. 스레드 덤프는 Java 애플리케이션에서 교착 상태 원인을 분석하고 식별하는 데 매우 중요하므로 개발자는 차단된 스레드의 원인을 정확히 찾아낼 수 있습니다.VisualVM은 여러 명령줄 JDK 도구를 통합하여 Java 애플리케이션에 대한 포괄적인 개요를 제공하는 시각적 도구입니다. 애플리케이션 모니터링 및 프로파일링, 메모리 누수 진단, 성능 분석에 널리 사용됩니다.
실행 중인 JVM 프로세스에 연결합니다.
jstack은 스레드에 크게 의존하는 복잡한 애플리케이션을 다루는 모든 Java 개발자를 위한 귀중한 명령줄 도구입니다. 스레드 상태, 잠금 동작 및 실행 흐름에 대한 자세한 통찰력을 제공함으로써 jstack은 디버깅 프로세스를 단순화하여 교착 상태, 성능 병목 현상, 애플리케이션 정지와 같은 문제를 더 쉽게 찾아내고 해결할 수 있도록 해줍니다.
jstack을 사용하여 실행 중인 Java 애플리케이션의 스레드 덤프를 캡처하려면 Java 프로세스의 프로세스 ID(PID)가 필요합니다. 단계별 가이드는 다음과 같습니다.
C:\Program Files\Java\jdk-21\bin>jps -l 12912 22480 org.springframework.ide.vscode.boot.app.BootLanguageServerBootApp 24020 jdk.jcmd/sun.tools.jps.Jps 14344 org/netbeans/Main 21944 deadlock/deadlock.DeadlockExample
C:\Program Files\Java\jdk-21\bin>jstack 21944 2024-11-02 11:12:18 Full thread dump Java HotSpot(TM) 64-Bit Server VM (21.0.5+9-LTS-239 mixed mode, sharing): Threads class SMR info: . .. .... ... "Thread-0" #29 [18484] prio=5 os_prio=0 cpu=0.00ms elapsed=1896.34s tid=0x000001bb3395ac40 nid=18484 waiting for monitor entry [0x00000099227ff000] java.lang.Thread.State: BLOCKED (on object monitor) at deadlock.DeadlockExample.lambda(deadlock/DeadlockExample.java:23) - waiting to lock <0x000000070d03c740> (a java.lang.Object) - locked <0x000000070d05a828> (a java.lang.Object) at deadlock.DeadlockExample$$Lambda/0x000001bb350019f8.run(deadlock/Unknown Source) at java.lang.Thread.runWith(java.base@21.0.5/Thread.java:1596) at java.lang.Thread.run(java.base@21.0.5/Thread.java:1583) "Thread-1" #30 [23240] prio=5 os_prio=0 cpu=0.00ms elapsed=1896.34s tid=0x000001bb3395b2a0 nid=23240 waiting for monitor entry [0x00000099228ff000] java.lang.Thread.State: BLOCKED (on object monitor) at deadlock.DeadlockExample.lambda(deadlock/DeadlockExample.java:41) - waiting to lock <0x000000070d05a828> (a java.lang.Object) - locked <0x000000070d03c740> (a java.lang.Object) at deadlock.DeadlockExample$$Lambda/0x000001bb35001c08.run(deadlock/Unknown Source) at java.lang.Thread.runWith(java.base@21.0.5/Thread.java:1596) at java.lang.Thread.run(java.base@21.0.5/Thread.java:1583) ... ..... .. Found one Java-level deadlock: ============================= "Thread-0": waiting to lock monitor 0x000001bb117727a0 (object 0x000000070d03c740, a java.lang.Object), which is held by "Thread-1" "Thread-1": waiting to lock monitor 0x000001bb11772500 (object 0x000000070d05a828, a java.lang.Object), which is held by "Thread-0" Java stack information for the threads listed above: =================================================== "Thread-0": at deadlock.DeadlockExample.lambda(deadlock/DeadlockExample.java:23) - waiting to lock <0x000000070d03c740> (a java.lang.Object) - locked <0x000000070d05a828> (a java.lang.Object) at deadlock.DeadlockExample$$Lambda/0x000001bb350019f8.run(deadlock/Unknown Source) at java.lang.Thread.runWith(java.base@21.0.5/Thread.java:1596) at java.lang.Thread.run(java.base@21.0.5/Thread.java:1583) "Thread-1": at deadlock.DeadlockExample.lambda(deadlock/DeadlockExample.java:41) - waiting to lock <0x000000070d05a828> (a java.lang.Object) - locked <0x000000070d03c740> (a java.lang.Object) at deadlock.DeadlockExample$$Lambda/0x000001bb35001c08.run(deadlock/Unknown Source) at java.lang.Thread.runWith(java.base@21.0.5/Thread.java:1596) at java.lang.Thread.run(java.base@21.0.5/Thread.java:1583) Found 1 deadlock.
VisualVM 및 jstack은 특히 성능 문제, 교착 상태 및 스레드 병목 현상을 처리할 때 Java 애플리케이션을 진단하고 문제를 해결하기 위한 Java 개발자 툴킷의 두 가지 필수 도구입니다.
VisualVM과 jstack은 함께 VisualVM이 광범위한 실시간 성능 통찰력과 jstack을 제공하여 Java 애플리케이션 디버깅에 대한 포괄적인 접근 방식을 제공합니다. 스레드 수준의 심층적인 분석이 가능합니다. 이들을 결합하여 사용하면 개발자는 개발 및 프로덕션 환경 모두에서 복잡한 Java 문제를 효과적으로 진단하고 해결할 수 있습니다.
이 글을 쓸 수 있게 해준 온라인 문서, 커뮤니티 및 모든 리소스에 큰 감사를 드립니다.
위 내용은 VisualVM 및 jstack을 사용하여 Java 앱 디버그 및 모니터링의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!