programing

kill - 3을 사용하여 Java 스레드 덤프를 가져옵니다.

javaba 2022. 12. 25. 10:53
반응형

kill - 3을 사용하여 Java 스레드 덤프를 가져옵니다.

사용하고 있다kill -3명령어를 사용하여 JVM의 스레드 덤프를 unix로 표시합니다.하지만 이 출력은 어디서 찾을 수 있나요?kill명령어?길을 잃었어요!!

또는 jstack(JDK에 포함)을 사용하여 스레드 덤프를 가져와 원하는 위치에 출력을 쓸 수 있습니다.Unix 환경에서는 사용할 수 없습니까?

jstack PID > outfile

스레드 덤프는 다음 명령을 실행한 VM의 시스템에 기록됩니다.kill -3JVM의 콘솔 출력을 파일로 리다이렉트하는 경우 스레드 덤프는 해당 파일에 포함됩니다.JVM이 열린 콘솔에서 실행 중인 경우 스레드 덤프가 콘솔에 표시됩니다.

LogVMOutput 진단 옵션을 사용하여 브레이크 신호 시 JVM 스레드 덤프 출력을 별도의 파일로 리디렉션하는 방법이 있습니다.

-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log

Java 8을 사용하면jcmd권장되는 접근법입니다.

jcmd <PID> Thread.print

다음은 Oracle 문서의 일부입니다.

JDK 8의 릴리스에서는 Java Mission Control, Java Flight Recorder 및 JVM 및 Java 애플리케이션의 문제를 진단하기 위한 jcmd 유틸리티가 도입되었습니다.진단을 강화하고 성능 오버헤드를 줄이려면 이전 jstack 유틸리티 대신 최신 유틸리티 jcmd를 사용하는 것이 좋습니다.

그러나 어플리케이션과 함께 발송하는 것은 라이선스의 의미일 수 있습니다.

JVM의 stdout이 배치되어 있는 장소와 같은 장소에 있습니다.Tomcat 서버가 있는 경우, 이것은catalina_(date).out파일.

kill - 3을 사용하는 경우 표준 출력에 스레드 덤프가 표시됩니다.대부분의 응용 프로그램서버는 표준 출력을 별도의 파일에 씁니다.kill -3을 사용하면 거기서 찾을 수 있습니다.스레드 덤프를 취득하는 방법은 여러 가지가 있습니다.

  • kill -3 <PID>: 표준 출력에 출력을 제공합니다.
  • 서버가 실행되고 있는 콘솔창에 액세스 할 수 있는 경우는 + 키 조합을 Break사용하여 STDOUT에서 스택트레이스를 생성할 수 있습니다.
  • 핫스팟 VM의 경우jstack스레드 덤프를 생성하기 위한 명령어입니다.JDK의 일부입니다.구문은 다음과 같습니다.

    Usage:
    
    jstack [-l] <pid> (to connect to running process)
    jstack -F [-m] [-l] <pid>(to connect to a hung process)
    
     - For JRockit JVM we can use JRCMD command which comes with JDK Syntax: 
       jrcmd <jrockit pid> [<command> [<arguments>]] [-l] [-f file] [-p] -h]
    

Jboss에서는 다음 작업을 수행할 수 있습니다.

nohup $JBOSS_HOME/bin/run.sh -c  yourinstancename $JBOSS_OPTS >> console-$(date +%Y%m%d).out  2>&1 < /dev/null &
kill -3 <java_pid>

그러면 출력/스레드 덤프가 위의 명령어로 지정된 파일콘솔로 리다이렉트 됩니다

  1. 프로세스 ID [PS ID]를 검색합니다.
  2. jcmd [PS ID] Thread.print를 실행합니다.

독립 실행형 Java 프로세스의 스레드 덤프를 원하는 경우 따라야 하는 단계

스텝 1: Java 프로그램을 호출하는 셸 스크립트의 프로세스 ID를 가져옵니다.

linux$ ps -aef | grep "runABCD"

user1  **8535**  4369   0   Mar 25 ?           0:00 /bin/csh /home/user1/runABCD.sh

user1 17796 17372   0 08:15:41 pts/49      0:00 grep runABCD

순서 2: runABCD에 의해 호출된 자녀의 프로세스 ID를 가져옵니다.위의 PID를 사용하여 하위 항목을 가져옵니다.

linux$ ps -aef | grep **8535**

user1  **8536**  8535   0   Mar 25 ?         126:38 /apps/java/jdk/sun4/SunOS5/1.6.0_16/bin/java -cp /home/user1/XYZServer

user1  8535  4369   0   Mar 25 ?           0:00 /bin/csh /home/user1/runABCD.sh

user1 17977 17372   0 08:15:49 pts/49      0:00 grep 8535

스텝 3: 특정 프로세스의 JSTACK을 가져옵니다.XYS Server 프로세스의 프로세스 ID(8536 등)를 취득합니다.

linux$ jstack **8536** > threadDump.log

언급URL : https://stackoverflow.com/questions/4876274/kill-3-to-get-java-thread-dump

반응형