Tôi đang sử dụng kill -3
lệnh để xem kết xuất luồng của JVM trong unix. Nhưng tôi có thể tìm đầu ra của kill
lệnh này ở đâu? Tôi bị lạc !!
Tôi đang sử dụng kill -3
lệnh để xem kết xuất luồng của JVM trong unix. Nhưng tôi có thể tìm đầu ra của kill
lệnh này ở đâu? Tôi bị lạc !!
Câu trả lời:
Bạn cũng có thể sử dụng jstack (Có kèm theo JDK) để lấy kết xuất luồng và viết đầu ra bất cứ nơi nào bạn muốn. Điều đó không có sẵn trong một môi trường unix?
jstack PID > outfile
Kết xuất luồng được ghi vào hệ thống ra khỏi VM mà bạn đã thực thi kill -3
. Nếu bạn đang chuyển hướng đầu ra giao diện điều khiển của JVM sang một tệp, kết xuất luồng sẽ nằm trong tệp đó. Nếu JVM đang chạy trong một bàn điều khiển mở, thì kết xuất luồng sẽ được hiển thị trong bàn điều khiển của nó.
Có một cách để chuyển hướng đầu ra kết xuất luồng JVM trên tín hiệu ngắt sang tệp riêng biệt với tùy chọn chẩn đoán LogVMOutput :
-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log
Với Java 8 trong hình, jcmd
là cách tiếp cận ưa thích.
jcmd <PID> Thread.print
Sau đây là đoạn trích từ tài liệu của Oracle :
Việc phát hành JDK 8 đã giới thiệu Java Mission Control, Java Flight Recorder và tiện ích jcmd để chẩn đoán các vấn đề với các ứng dụng JVM và Java. Bạn nên sử dụng tiện ích mới nhất, jcmd thay vì tiện ích jstack trước đây để chẩn đoán nâng cao và giảm chi phí hiệu năng.
Tuy nhiên, vận chuyển này với ứng dụng có thể là hàm ý cấp phép mà tôi không chắc chắn.
jcmd
không thể kết nối với quy trình dịch vụ của windows com.sun.tools.attach.AttachNotSupportedException: Insufficient memory or insufficient privileges to attach
trong khi jstack -F
thành công: stackoverflow.com/questions/1197912/iêu
Khi sử dụng kill -3, ta sẽ thấy kết xuất luồng trong đầu ra tiêu chuẩn. Hầu hết các máy chủ ứng dụng ghi đầu ra tiêu chuẩn vào một tệp riêng biệt. Bạn nên tìm thấy nó ở đó khi sử dụng kill -3. Có nhiều cách để có được các bãi chứa chủ đề:
kill -3 <PID>
: Cung cấp đầu ra cho đầu ra tiêu chuẩn.Đối với hotspot VM, chúng ta cũng có thể sử dụng jstack
lệnh để tạo kết xuất luồng. Đây là một phần của JDK. Cú pháp như sau:
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>
nên giết JVM. Bạn đang xem loại ứng dụng Java nào?
Các bước mà bạn nên làm theo nếu bạn muốn kết xuất luồng của Quá trình Java StandAlone của bạn
Bước 1: Nhận ID tiến trình cho tập lệnh shell gọi chương trình java
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
Bước 2: Nhận ID tiến trình cho trẻ em được gọi bởi runABCD. Sử dụng PID trên để có được những đứa trẻ.
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
Bước 3: Nhận JSTACK cho quy trình cụ thể. Lấy id quy trình của quy trình XYSServer của bạn. tức là 8536
linux$ jstack **8536** > threadDump.log