답변:
또는 jstack (JDK에 포함됨)을 사용하여 스레드 덤프를 가져와 원하는 곳에 출력을 작성할 수 있습니다. 유닉스 환경에서는 사용할 수 없습니까?
jstack PID > outfile
중단 신호의 JVM 스레드 덤프 출력을 LogVMOutput 진단 옵션을 사용하여 별도의 파일로 리디렉션하는 방법이 있습니다 .
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
그림에서 Java 8을 사용 jcmd
하는 것이 선호되는 접근 방식입니다.
jcmd <PID> Thread.print
다음은 Oracle 문서 의 스 니펫입니다 .
JDK 8 릴리스에는 JVM 및 Java 애플리케이션의 문제를 진단하기위한 Java Mission Control, Java Flight Recorder 및 jcmd 유틸리티가 도입되었습니다. 향상된 진단 및 성능 오버 헤드 감소를 위해 이전 jstack 유틸리티 대신 최신 유틸리티 인 jcmd를 사용하는 것이 좋습니다.
그러나 이것을 응용 프로그램과 함께 제공하면 라이선스에 영향을 미칠 수 있지만 확실하지 않습니다.
jcmd
와 윈도우 서비스 프로세스에 연결하는 데 실패 com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attach
하면서이 jstack -F
성공 : stackoverflow.com/questions/1197912/...
kill -3을 사용하면 표준 출력에서 스레드 덤프를 볼 수 있습니다. 대부분의 애플리케이션 서버는 표준 출력을 별도의 파일에 기록합니다. kill -3을 사용할 때 찾을 수 있습니다. 스레드 덤프를 가져 오는 방법에는 여러 가지가 있습니다.
kill -3 <PID>
: 표준 출력으로 출력합니다.핫스팟 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]
kill -3 <PID>
JVM을 죽여서는 안됩니다. 어떤 유형의 Java 앱을보고 있습니까?
독립 실행 형 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을 가져옵니다. XYSServer 프로세스의 프로세스 ID를 가져옵니다. 즉 8536
linux$ jstack **8536** > threadDump.log