IT story

Java 스레드 덤프를 얻으려면 -3을 종료하십시오.

hot-time 2020. 7. 30. 09:44
반응형

Java 스레드 덤프를 얻으려면 -3을 종료하십시오.


kill -3유닉스에서 JVM의 스레드 덤프를 보려면 명령을 사용 하고 있습니다. 그러나이 kill명령 의 출력을 어디에서 찾을 수 있습니까? 나는 길을 잃었다!


또는 jstack (JDK에 포함)을 사용하여 스레드 덤프를 수행하고 원하는 위치에 출력을 작성할 수 있습니다. 유닉스 환경에서는 사용할 수 없습니까?

jstack PID > outfile

스레드 덤프는 kill -3을 실행 한 VM 외부의 시스템에 기록됩니다. JVM의 콘솔 출력을 파일로 경로 재지 정하는 경우 스레드 덤프는 해당 파일에 있습니다. JVM이 열린 콘솔에서 실행중인 경우 스레드 덤프가 콘솔에 표시됩니다.


LogVMOutput 진단 옵션 을 사용하여 중단 신호에서 JVM 스레드 덤프 출력을 별도의 파일로 경로 재지 정하는 방법이 있습니다 .

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

그림 8에 Java jcmd가 선호되는 접근 방식입니다.

jcmd <PID> Thread.print

다음은 Oracle 설명서 의 스 니펫입니다 .

JDK 8 릴리스는 JVM 및 Java 응용 프로그램의 문제점을 진단하기위한 Java Mission Control, Java Flight Recorder 및 jcmd 유틸리티를 도입했습니다. 향상된 진단 및 성능 오버 헤드를 줄이기 위해 이전 jstack 유틸리티 대신 최신 유틸리티 jcmd를 사용하는 것이 좋습니다.

그러나 이것을 응용 프로그램과 함께 제공하면 라이센스에 영향을 줄 수 있습니다.


JVM의 stdout이있는 동일한 위치에 있습니다. Tomcat 서버가있는 경우 이것이 catalina_(date).out파일입니다.


kill -3을 사용하면 표준 출력에서 ​​스레드 덤프를 볼 수 있습니다. 대부분의 응용 프로그램 서버는 표준 출력을 별도의 파일에 씁니다. kill -3을 사용할 때 찾을 수 있습니다. 스레드 덤프를 얻는 방법에는 여러 가지가 있습니다.

  • Kill -3 : 표준 출력으로 출력합니다.
  • 서버가 실행중인 콘솔 창에 액세스 할 수있는 경우 Ctrl + Break 조합 키를 사용하여 std 출력에서 ​​스택 추적을 생성 할 수 있습니다.
  • 핫스팟 VM의 경우 jstack 명령을 사용하여 스레드 덤프를 생성 할 수도 있습니다. JDK의 일부입니다. 구문은 다음과 같습니다. 사용법 : jstack [-l] (실행중인 프로세스에 연결) jstack -F [-m] [-l] (중지 된 프로세스에 연결)
  • JRockit JVM의 경우 JDK 구문과 함께 제공되는 JRCMD 명령을 사용할 수 있습니다. jrcmd [[]] [-l] [-f 파일] [-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 실행

StandAlone 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에 의해 호출 된 Child의 프로세스 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을 가져옵니다. XYSServer 프로세스의 프로세스 ID를 확보하십시오. 즉 8536

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

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

반응형