JVM에서 스레드 덤프 가져오기

스레드 덤프는 현재 JVM(Java Virtual Machine)에서 활성화된 모든 Java 스레드 목록입니다. 이 문서에서는 JVM에서 스레드 덤프를 가져오는 여러 방법에 대해 설명합니다.

설명 description

환경

Experience Manager

문제/증상

Linux, UNIX 또는 Windows의 JVM에서 스레드 덤프를 가져오는 방법

스레드 덤프는 현재 JVM(Java Virtual Machine)에서 활성화된 모든 Java 스레드 목록입니다.

JVM에서 스레드 덤프를 가져오는 방법에는 여러 가지가 있습니다. 1개 이상의 스레드 덤프를 사용하는 것이 좋습니다. 정기적으로 10개의 스레드 덤프를 수행하는 것이 좋습니다(예: 10초마다 1개의 스레드 덤프).

해결 방법 resolution

1단계: Java 프로세스의 PID 가져오기

스레드 덤프를 가져오기 위해 필요한 첫 번째 정보는 Java 프로세스의 PID입니다.

Java JDK는 모든 Java 프로세스 ID를 나열하는 jps 명령과 함께 제공됩니다. 다음과 같이 이 명령을 실행할 수 있습니다.

jps -l 70660 sun.tools.jps.Jps 70305

참고: Linux 및 UNIX에서는 다음과 같이 이 명령을 실행해야 할 수 있습니다. sudo -u user jps -l: 여기서 "user"는 Java 프로세스가 실행 중인 사용자의 사용자 이름입니다.

작동하지 않거나 Java 프로세스(경로가 설정되지 않았거나 JDK가 설치되지 않았거나 이전 Java 버전)를 찾을 수 없는 경우

  • UNIX, Linux 및 Mac OS X: ps -el | grep java
  • Windows: 작업 관리자를 열고 Java 프로세스의 PID를 찾으려면 Ctrl+Shift+Esc를 누릅니다.

2단계: JVM에서 스레드 덤프 요청

jstack

설치/사용 가능한 경우 jstack 도구. 명령줄 콘솔에 스레드 덤프를 인쇄합니다.

jstack을 사용하여 스레드 덤프를 가져오려면 다음 명령을 실행합니다.
jstack -l <pid>

console output redirect/append 지시문을 사용하여 연속적인 스레드 덤프를 파일로 출력할 수 있습니다.
jstack -l <pid> >> threaddumps.log

참고:

  • jstack 도구는 JDK 1.5 이후 사용할 수 있습니다(Windows의 JVM인 경우 일부 버전의 JDK 1.5 및 JDK 1.6에서만 사용 가능).

  • jstack은 -Xrs jvm 매개변수 활성화됨

  • JDK 1.6의 jstack 도구를 사용하여 JDK 1.5에서 실행되는 프로세스에서 스레드덤프를 가져올 수 없습니다.

  • Linux 및 UNIX에서는 Java 프로세스를 소유한 사용자로 명령을 실행해야 합니다.

    sudo -u java-user jstack -l <pid>

    (< java-user> 는 Java 프로세스가 실행 중인 사용자의 ID로 대체되어야 합니다)

  • Windows에서 jstack을 실행하고 "이 명령을 처리하는 데 사용할 수 있는 저장소가 충분하지 않음" 오류가 발생하면 jstack을 windows SYSTEM 사용자 또는 Java 프로세스를 소유한 사용자로 실행해야 합니다. 다운로드할 수 있는 psexec를 사용하여 이를 수행할 수 있습니다. 여기. jstack을 SYSTEM 사용자로 실행하려면 다음과 같은 명령을 사용합니다.

    psexec -s jstack <pid>   >> threaddumps.log

    서버에 psexec를 설치할 수 없는 경우 명령이 포함된 .bat 파일을 만들고 실행할 수 있습니다 다른 사용자로 Windows 작업 스케줄러 사용.

  • Java 프로세스가 응답하지 않는 경우 옵션을 사용하는 데 도움이 될 수 있습니다 -J-d64 (64비트 시스템에서) 예:

    jstack -J-d64 -l   <pid>   >> threaddumps.log

  • jstack 명령(jstack -l <pid> >> threaddumps.log)에서 오류가 발생합니다 [ 1] 그런 다음 java 프로세스를 소유한 사용자로 명령을 실행합니다. 예:

    sudo -u sling jstack -l <pid> >> threaddumps.log

Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted

sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted

...

Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted

...

sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:138)

JSTACK 스크립트

여기 있습니다 script (다음에 대한 버전에서 조정됨) eclipse.org) jstack을 사용하여 일련의 스레드 덤프를 가져오는 것입니다. 또한 top 명령을 사용하는 스레드 수준 cpu 사용량도 필요합니다.

다음과 같이 실행하십시오.

sudo -u <user> jstackSeries.sh
<pid> <aemserveruser> <count> <delay>

예: sudo -u aemuser jstackSeries.sh 1234 aemserveruser 10 3

  • 1234 는 Java 프로세스의 PID입니다
  • cq5serveruser 는 Java 프로세스가 실행되는 Linux 또는 UNIX 사용자입니다
  • 10 가져올 스레드 덤프의 수입니다
  • 3 각 덤프 사이의 지연 시간

참고: 최상위 출력에는 10진수 형식의 기본 스레드 ID가 있지만 jstack 출력에는 16진수로 구성된 nid가 있습니다. 스레드 ID를 16진수로 변환하여 상위 출력에서 jstack 출력으로 높은 cpu 스레드를 일치시킬 수 있습니다.

위의 대본 외에도 비슷한 내용이 있습니다 Windows Powershell 스크립트 및 github의 Adobe AEM 특정 스크립트.

스레드 덤프를 가져오는 다른 방법

다음과 같은 경우 jstack 도구를 사용할 수 없으므로 다음과 같이 스레드 덤프를 수행할 수 있습니다.

참고: 일부 도구는 commandline 매개 변수가 있는 경우 JVM에서 스레드 덤프를 가져올 수 없습니다 -Xrs 이(가) 활성화되었습니다. 스레드 덤프를 가져오는 데 문제가 있는 경우 이 옵션이 활성화되어 있는지 확인하십시오.

UNIX, Mac OS X 및 Linux(JDK 1.4 이하 버전)

UNIX, Mac OS X 및 Linux에서는 QUIT 신호를 Java 프로세스로 전송하여 스레드 덤프를 표준 출력으로 출력하도록 할 수 있습니다.

  1. 이 명령을 실행하여 다음을 수행합니다.

    kill -QUIT <pid>

    이 명령은 다음과 같이 실행해야 할 수 있습니다. sudo -u user kill -QUIT <pid> 여기서 "user"는 Java 프로세스를 실행 중인 사용자입니다.

  2. 를 사용하여 CQSE를 시작하는 경우 crx-quickstart/server/start 스크립트를 작성하면 스레드 덤프가 crx-quickstart/server/logs/startup.log. JBoss, WebSphere, Tomcat 또는 기타 같은 서드파티 애플리케이션 서버를 사용하는 경우 서버의 설명서를 참조하여 표준 출력이 대상으로 하는 파일을 확인하십시오.

Windows:

JDK 1.X

  1. javadump.exe를 다운로드합니다(아래 첨부).
  2. 다음 세 개의 인수를 사용하여 JVM을 시작합니다(올바른 순서여야 함).

    -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile= C:\temp\jvmoutput.log
  3. Ctrl+Shift+Esc를 눌러 작업 관리자를 엽니다.
  4. Java 프로세스의 PID를 찾습니다.
  5. 명령줄에서 다음을 실행합니다. javadump.exe   <pid>
  6. 스레드 덤프가 jvmoutput.log 2단계에서 언급된 파일입니다.

JDK 1.6

에서 스레드 덤프 가져오기 jconsole 플러그인을 사용한 도구: [ 0]

스레드 덤프를 요청하는 방법은 다음과 같습니다.

  1. Communique를 실행하는 jvm에 다음 매개 변수를 추가합니다.

    Dcom.sun.management.jmxremote
  2. JDK 1.6(아직 설치되지 않은 경우)을 다운로드하여 설치합니다.
  3. 다운로드 및 추출 스레드 덤프 분석기 유틸리티. [ 1]
  4. 실행 jconsole.exe JDK 1.6의 경우:

    jconsole.exe -pluginpath /path/to/file/tda.jar
  5. 다음을 클릭합니다. 스레드 덤프 탭.
  6. 다음을 클릭합니다. 요청 스레드 덤프 링크를 클릭합니다.

참고: AEM 6을 실행하는 경우* 실행 중인 스레드를 관찰하고 싶다면 다음을 요청할 수 있습니다. http://<host>:<port>/system/console/status-Threads 스레드 목록을 가져옵니다. 그러나 이러한 스레드 덤프는 사무라이나 tda와 같은 스레드 덤프 분석 도구에서는 작동하지 않습니다.

적용 대상:

JVM에서 실행되는 모든 Adobe 제품

스레드 덤프 분석 도구

[ 0] PsExec v2.42 Microsoft 설명서의 Sysinternals에서 다음을 수행합니다.

[ 1] TDA - 스레드 덤프 분석기 irockel/tda on Github.com.

[ 2] Java 스레드 덤프 분석기 FastThread에서

[ 3] IBM 스레드 및 모니터 덤프 분석기 IBM Support Assistant 설명서를 참조하십시오.

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f