VisualVM 및 jstack을 사용하여 Java 앱 디버그 및 모니터링
Java 애플리케이션, 특히 프로덕션 환경에서 실행되는 애플리케이션은 추적하기 어려울 수 있는 성능 병목 현상, 교착 상태 및 메모리 누수를 유발할 수 있습니다. 이러한 문제가 발생하는 경우 애플리케이션을 원활하게 실행하고 긍정적인 사용자 경험을 유지하려면 빠르고 효과적인 디버깅이 필수적입니다. VisualVM과 JStack이 Java 개발자에게 귀중한 도구가 되는 곳입니다.
강력한 프로파일링 및 모니터링 기능을 갖춘VisualVM과 상세한 스레드 덤프를 제공하는 jstack은 개발자가 용이합니다.
교착 상태를 진단하고 해결하는 것은 특히 고성능 애플리케이션에서 매우 중요합니다. 이 가이드에서는 두 가지 강력한 Java 도구인 VisualVM 및 jstack을 사용하여 교착 상태를 감지하고 스레드 덤프를 얻는 방법을 살펴봅니다.
1. 교착 상태 및 스레드 덤프 이해
도구에 대해 자세히 알아보기 전에 몇 가지 기본 사항을 명확히 하겠습니다.
교착 상태
: 스레드가 서로 리소스를 해제하기를 기다리는 상황으로 인해 무한한 차단 주기가 발생합니다.스레드 덤프
: 상태 및 보류 중이거나 대기 중인 잠금에 대한 세부 정보를 포함하여 특정 시간에 Java 애플리케이션 내 활성 스레드의 스냅샷입니다. 스레드 덤프는 Java 애플리케이션에서 교착 상태 원인을 분석하고 식별하는 데 매우 중요하므로 개발자는 차단된 스레드의 원인을 정확히 찾아낼 수 있습니다.2. VisualVM 소개
VisualVM은 여러 명령줄 JDK 도구를 통합하여 Java 애플리케이션에 대한 포괄적인 개요를 제공하는 시각적 도구입니다. 애플리케이션 모니터링 및 프로파일링, 메모리 누수 진단, 성능 분석에 널리 사용됩니다.
주요 특징
- 실시간 모니터링 및 프로파일링
- 스레드 분석
- 메모리 및 CPU 사용량 통계
- 교착 상태 분석을 위한 스레드 덤프
VisualVM을 사용하여 디버그(Java 애플리케이션용)
- VisualVM 다운로드
- VisualVM을 엽니다.
-
실행 중인 JVM 프로세스에 연결합니다. - 모니터링 도구에서 스레드 덤프를 클릭하거나 스레드 세부정보를 실시간으로 볼 수 있습니다.
3. jstack 소개
jstack은 스레드에 크게 의존하는 복잡한 애플리케이션을 다루는 모든 Java 개발자를 위한 귀중한 명령줄 도구입니다. 스레드 상태, 잠금 동작 및 실행 흐름에 대한 자세한 통찰력을 제공함으로써 jstack은 디버깅 프로세스를 단순화하여 교착 상태, 성능 병목 현상, 애플리케이션 정지와 같은 문제를 더 쉽게 찾아내고 해결할 수 있도록 해줍니다.
주요 특징
- jstack은 RUNNABLE, BLOCKED, WAITING 또는 TIMED_WAITING 과 같은 각 스레드의 상태를 표시합니다.
- 복잡한 스레딩 문제를 디버깅하는 데 도움이 되도록 라이브 또는 중단된 프로세스에 대한 스택 추적을 캡처합니다.
- jstack은 스레드 덤프에서 교착 상태의 스레드를 표시하여 신속하게 식별할 수 있도록 합니다.
- JVM의 모든 활성 스레드를 나열하는 스레드 덤프를 얻습니다.
- VisualVM 또는 jmap과 같은 다른 도구와 함께 jstack을 사용하면 과도한 객체 생성이나 참조 유지를 담당하는 스레드로 메모리 누수를 추적할 수 있습니다.
- 개발자는 스레드 덤프를 분석하여 문제가 있는 동기화, 과도한 차단 또는 경합을 줄일 수 있는 기회를 식별하여 동시성과 응답성을 향상시킬 수 있습니다.
jstack을 사용하여 스레드 덤프 획득 및 분석
jstack을 사용하여 실행 중인 Java 애플리케이션의 스레드 덤프를 캡처하려면 Java 프로세스의 프로세스 ID(PID)가 필요합니다. 단계별 가이드는 다음과 같습니다.
- 1단계: 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
- 2단계: jstack을 사용하여 스레드 덤프 캡처
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.
메모
- jstack은 JDK에서 사용할 수 있으므로 JDK가 설치되어 있고 해당 환경에 액세스할 수 있는지 확인하세요.
- 일부 시스템에서 jstack을 사용하려면 관리자 권한이 필요할 수 있습니다.
- jstack -l 12345 사용 > threaddump.txt는 스레드 덤프를 threaddump.txt라는 파일에 저장합니다.
아웃트로
VisualVM 및 jstack은 특히 성능 문제, 교착 상태 및 스레드 병목 현상을 처리할 때 Java 애플리케이션을 진단하고 문제를 해결하기 위한 Java 개발자 툴킷의 두 가지 필수 도구입니다.
VisualVM과 jstack은 함께 VisualVM이 광범위한 실시간 성능 통찰력과 jstack을 제공하여 Java 애플리케이션 디버깅에 대한 포괄적인 접근 방식을 제공합니다. 스레드 수준의 심층적인 분석이 가능합니다. 이들을 결합하여 사용하면 개발자는 개발 및 프로덕션 환경 모두에서 복잡한 Java 문제를 효과적으로 진단하고 해결할 수 있습니다.
참조
이 글을 쓸 수 있게 해준 온라인 문서, 커뮤니티 및 모든 리소스에 큰 감사를 드립니다.
- VisualVM 사용방법
- 멀티스레딩 개념 1부: 원자성과 불변성
- 자바 VisualVM
위 내용은 VisualVM 및 jstack을 사용하여 Java 앱 디버그 및 모니터링의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

일부 애플리케이션이 제대로 작동하지 않는 회사의 보안 소프트웨어에 대한 문제 해결 및 솔루션. 많은 회사들이 내부 네트워크 보안을 보장하기 위해 보안 소프트웨어를 배포 할 것입니다. ...

많은 응용 프로그램 시나리오에서 정렬을 구현하기 위해 이름으로 이름을 변환하는 솔루션, 사용자는 그룹으로, 특히 하나로 분류해야 할 수도 있습니다.

시스템 도킹의 필드 매핑 처리 시스템 도킹을 수행 할 때 어려운 문제가 발생합니다. 시스템의 인터페이스 필드를 효과적으로 매핑하는 방법 ...

데이터베이스 작업에 MyBatis-Plus 또는 기타 ORM 프레임 워크를 사용하는 경우 엔티티 클래스의 속성 이름을 기반으로 쿼리 조건을 구성해야합니다. 매번 수동으로 ...

IntellijideAultimate 버전을 사용하여 봄을 시작하십시오 ...

Java 객체 및 배열의 변환 : 캐스트 유형 변환의 위험과 올바른 방법에 대한 심층적 인 논의 많은 Java 초보자가 객체를 배열로 변환 할 것입니다 ...

전자 상거래 플랫폼에서 SKU 및 SPU 테이블의 디자인에 대한 자세한 설명이 기사는 전자 상거래 플랫폼에서 SKU 및 SPU의 데이터베이스 설계 문제, 특히 사용자 정의 판매를 처리하는 방법에 대해 논의 할 것입니다 ...

Redis 캐싱 솔루션은 제품 순위 목록의 요구 사항을 어떻게 인식합니까? 개발 과정에서 우리는 종종 a ... 표시와 같은 순위의 요구 사항을 처리해야합니다.
