UNIX 또는 Windows의 JVM에서 스레드 덤프를 가져오려면 어떻게 합니까 ?

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

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

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: Ctrl+Shift+Esc를 눌러 작업 관리자를 열고 Java 프로세스의 PID를 찾습니다.

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

jstack

jstack 도구가 설치된 경우/사용 가능한 경우 이 도구를 사용하는 것이 좋습니다. 명령줄 콘솔로 스레드 덤프를 인쇄합니다.

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

콘솔 출력 리디렉션을 사용하여 파일로 연속 스레드 덤프를 출력하거나 지시문을 첨부할 수 있습니다.
jstack -l <pid> >> threaddumps.log

참고:

  • jstack 도구는 JDK 1.5 이후 버전에서 사용할 수 있습니다(Windows의 JVM인 경우 JDK 1.5 및 JDK 1.6의 일부 버전에서만 사용 가능).
  • -Xrs jvm 매개 변수가 활성화되어 있어도 jstack이 작동합니다.
  • 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 작업 스케줄러를 사용하여(다른 사용자로서) 이를 실행할 수 있습니다.
  • 때로는 64비트 시스템에 -J-d64 옵션을 추가해야 합니다. 예:
     jstack -J-d64 -l <pid> >> threaddumps.log

jstack 스크립트

다음은 eclipse.org에서 가져온 스크립트로, jstack을 사용하여 일련의 스레드 덤프를 가져옵니다. 또한 최상위 명령을 사용하여 스레드 수준 CPU도 사용합니다.

#!/bin/bash
if [ $# -eq 0 ]; then
    echo >&2 "Usage: jstackSeries <pid> <run_user> [ <count> [ <delay> ] ]"
    echo >&2 "    Defaults: count = 10, delay = 0.5 (seconds)"
    exit 1
fi
pid=$1          # required
user=$2         # required
count=${3:-10}  # defaults to 10 times
delay=${4:-0.5} # defaults to 0.5 seconds
while [ $count -gt 0 ]
do
    sudo -u $user top -H -b -n1 -p $pid >top.$pid.$(date +%H%M%S.%N) &
    sudo -u $user jstack -l $pid >jstack.$pid.$(date +%H%M%S.%N)
    sleep $delay
    let count--
    echo -n "."
완료

 

다음과 같이 실행하면 됩니다.
sh jstackSeries.sh [pid] [cq5serveruser] [count] [delay]

예:
sh jstackSeries.sh 1234 cq5serveruser 10 3

  • 1234는 Java 프로세스의 pid입니다.
  • cq5serveruser는 Java 프로세스에서 실행하는 Linux 또는 UNIX 사용자입니다.
  • 10은 가져온 스레드 덤프 수입니다.
  • 3은 각 덤프 간 지연 시간입니다.

참고: 최상위 출력에는 10진수 형식의 기본 스레드 ID가 있고, jstack 출력에는 16진수의 NID가 있습니다. 스레드 ID를 16진수로 변환하여 상위 출력의 높은 CPU 스레드를 jstack 출력에 일치시킬 수 있습니다.

Adobe Experience Manager용 스레드 덤프 도구

Adobe Experience Manager 제품을 사용 중이라면 이 도구를 설치하여 스레드 덤프를 생성하는 간단한 UI를 만들 수 있습니다.

스레드 덤프를 가져오는 대체 방법

jstack 도구를 사용할 수 없는 경우 다음과 같이 스레드 덤프를 가져올 수 있습니다.

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

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. crx-quickstart/server/start 스크립트를 사용하여 CQSE를 시작하는 경우 스레드 덤프가 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: mpjvmoutput.log
  3. Ctrl+Shift+Esc를 눌러 작업 관리자를 엽니다.
  4. Java 프로세스의 PID를 찾습니다.
  5. 명령줄에서
    javadump.exe [pid]를 실행합니다.
  6. 스레드 덤프가 2단계에서 언급한 jvmoutput.log 파일에 표시됩니다.
JDK 1.6

플러그인 [0]을(를) 사용하여 jconsole 도구에서 스레드 덤프를 가져옵니다.

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

  1. Communique를 실행 중인 jvm에 다음 매개 변수를 추가합니다. -Dcom.sun.management.jmxremote
  2. JDK 1.6을 아직 설치하지 않은 경우 다운로드하여 설치합니다.
  3. 스레드 덤프 분석기 유틸리티를 다운로드하여 압축을 풉니다. [1]
  4. JDK 1.6의 jconsole.exe를 실행합니다.
                                jconsole.exe -pluginpath /path/to/file/tda.jar
  5. 스레드 덤프 탭을 클릭합니다.
  6. 스레드 덤프 요청 링크를 클릭합니다.

참고: CQ5 및 CRX(Sling 포함)를 실행 중이며 실행 중인 스레드를 관찰하려면 스레드 목록을 가져오도록 http://<host>:<port>/system/console/threads에 요청할 수 있습니다. 하지만 이러한 스레드 덤프는 samurai 또는 tda와 같은 스레드 덤프 분석 도구에서 작동하지 않습니다.

적용 대상

JVM에서 실행 중인 모든 Adobe 제품

[0] http://technet.microsoft.com/ko-kr/sysinternals/bb897553.aspx
[1] https://github.com/irockel/tda
[2] http://docs.day.com/kr/home/docutools/javadump_exe.html

다운로드

이 작업에는 Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License의 라이센스가 부여되었습니다.  Twitter™ 및 Facebook 게시물은 Creative Commons 약관을 적용받지 않습니다.

법적 고지 사항   |   온라인 개인 정보 보호 정책