2011-02-02 27 views
85

Tôi đang sử dụng lệnh kill -3 để xem kết xuất chuỗi của JVM trong unix. Nhưng tôi có thể tìm thấy đầu ra của lệnh kill ở đâu? Tôi bị mất !!kill -3 để lấy java thread dump

+0

Bạn đang giết quá trình nào? Đây có phải là máy chủ ứng dụng J2EE không? Nếu đó là trường hợp bạn nên tìm dấu vết ngăn xếp trong tiêu chuẩn ra ngoài. –

+0

Tôi đang giết một quá trình chạy lớp java – javanerd

+1

Không nên viết chuỗi kết xuất trên bảng điều khiển. kể từ khi lớp java có giao diện điều khiển như std ra – javanerd

Trả lời

158

Bạn cũng có thể sử dụng jstack (Đã bao gồm JDK) để lấy kết xuất chuỗi và viết kết quả đầu ra bất cứ nơi nào bạn muốn. Điều đó không có sẵn trong môi trường Unix?

jstack PID > outfile 
+0

Cảm ơn điều đó.Absolutely !! Có, tôi có thể sử dụng điều này. jstack PID> outfile sẽ xuất kết xuất chuỗi tại khoảng thời gian cụ thể đó. Phải không? – javanerd

+1

Có - tại thời điểm nó được chạy. Bạn cũng có thể chỉ định -l (chữ thường L) cho một danh sách dài in thông tin khóa bổ sung –

+2

Cho đến khi lệnh jstack không nhất quán do "Không thể suy ra loại chuỗi từ địa chỉ" ;-( – noahlz

6

Trong cùng một vị trí nơi đặt giá trị của JVM. Nếu bạn có máy chủ Tomcat, đây sẽ là tệp catalina_(date).out.

30

Kết xuất chuỗi được ghi vào hệ thống ra khỏi VM mà trên đó bạn đã thực hiện lệnh giết -3. Nếu bạn đang chuyển hướng đầu ra bàn điều khiển của JVM vào một tệp, thì kết xuất chuỗi 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 chuỗi sẽ được hiển thị trong bảng điều khiển của nó.

+1

Có một cách để chuyển hướng đầu ra kết xuất của luồng JVM thành tệp riêng biệt. Xem trong câu trả lời của tôi. – Vadzim

26

Có một cách để chuyển hướng JVM đầu ra chủ đề bãi trên tín hiệu nghỉ ngơi để tập tin riêng biệt với LogVMOutput diagnostic option:

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

Về mặt kỹ thuật, điều này không "chuyển hướng" kết xuất kết xuất đề. vào jvm.log (bao gồm đầu ra kết xuất chuỗi) nhưng kill -QUIT sẽ vẫn đổ vào stdout của tiến trình (đúng). Được bỏ phiếu cho mô tả các tùy chọn JVM tối nghĩa :) – sqweek

2

Trong Jboss bạn có thể thực hiện như sau

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

này sẽ chuyển hướng đầu ra của bạn/threadump để giao diện điều khiển tập tin được chỉ định trong lệnh trên.

7

Khi sử dụng kill -3, bạn sẽ thấy kết xuất chuỗi 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 nó ở đó khi sử dụng kill -3. Có nhiều cách để nhận các bãi chứa chuỗi:

  • Giết -3: Cung cấp đầu ra cho đầu ra tiêu chuẩn.
  • Nếu có quyền truy cập vào cửa sổ bảng điều khiển nơi máy chủ đang chạy, người dùng có thể sử dụng tổ hợp phím Ctrl + Break để tạo dấu vết ngăn xếp trên đầu ra std.
  • Đối với VM điểm phát sóng, chúng tôi cũng có thể sử dụng lệnh jstack để tạo kết xuất chuỗi. Nó là một phần của JDK. Cú pháp như sau: Cách sử dụng: jstack [-l] (để kết nối với quy trình đang chạy) jstack -F [-m] [-l] (để kết nối với quá trình treo)
  • Đối với JRockit JVM chúng tôi có thể sử dụng JRCMD lệnh mà đi kèm với JDK Cú pháp: jrcmd [[]] [-l] [file -f] [-p] -h]
2
  1. Tìm quá trình id [PS ID]
  2. Execute jcmd [PS ID] Thread.print
17

Với Java 8 trong ảnh, jcmd là cách tiếp cận ưa thích.

jcmd <PID> Thread.print 

Sau đây là đoạn mã từ Oracle documentation:

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í hoạt động.

Tuy nhiên, giao hàng này với ứng dụng có thể là các tác động cấp phép mà tôi không chắc chắn.

+0

Không may là 'jcmd' không kết nối được với quá trình dịch vụ windows với' com.sun.tools.attach.AttachNotSupportedException: Không đủ bộ nhớ hoặc không đủ đặc quyền để đính kèm' trong khi 'jstack -F' thành công: https://stackoverflow.com/questions/1197912/cant-debug-java-windows-services-with-jhat-jps-jstack/47723393#47723393 – Vadzim

1

bước mà bạn nên làm theo nếu bạn muốn bãi chứa thread của Process độc lập Java của bạn

Bước 1: Lấy Process ID cho shell script 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: Lấy ID tiến trình cho trẻ được viện dẫn bởi runABCD. Sử dụng PID ở trên để có con.

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: Lấy jstack cho quá trình cụ thể. Lấy Id tiến trình của quy trình XYSServer của bạn. tức là 8536

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