2012-07-10 7 views
8

Tôi có vấn đề sau:
Tôi triển khai một ứng dụng web trong Tomcat (Linux) và sau khi tắt Tomcat, nếu tôi làm ps -ef Tôi vẫn có thể thấy quy trình java đang chạy.
Tôi tin rằng điều này xảy ra do một số chủ đề treo nhưng tôi không biết làm cách nào để theo dõi chuỗi này.
Tôi làm cách nào để gỡ lỗi vấn đề này?Làm cách nào để gỡ rối một chuỗi java bị treo?

Trả lời

5

Bạn có thể tạo 4-5 chuỗi kết xuất như được mô tả bên dưới và sau đó phân tích chúng bằng các công cụ như Samurai.

Những gì bạn muốn kiểm tra là khi một chuỗi bị mắc kẹt hoặc giao dịch chạy dài xảy ra, tất cả các bãi luồng sẽ hiển thị một id chuỗi nhất định nằm ở cùng một dòng trong dấu vết ngăn xếp java của bạn. Nói một cách đơn giản, giao dịch được trải rộng trên nhiều bãi chứa chuỗi và do đó cần điều tra thêm.

Bây giờ, khi bạn chạy các thông số này qua Samurai, nó sẽ đánh dấu những màu này bằng màu đỏ để bạn có thể nhanh chóng nhấp vào màu đó và chuyển đến các dòng hiển thị sự cố.

Xem ví dụ về số here này. Nhìn vào hình ảnh đầu ra Samurai trong liên kết đó. Các tế bào xanh là tốt. Các tế bào màu đỏ và xám cần nhìn vào.

Tạo một Dump Ðề tài:

(Linux)

Nếu JVM đang chạy trong một giao diện điều khiển sau đó bạn chỉ cần nhấn Ctrl-\. Nếu JVM đang chạy ở chế độ nền sau đó gửi tín hiệu QUIT:

kill -QUIT process_id

Có PROCESS_ID là số quá trình chạy tiến trình Java. Các bãi chứa thread sẽ được gửi đến bất cứ nơi nào tiêu chuẩn ra được chuyển hướng quá. Bạn thường có thể có được những con số quá trình của tất cả các tiến trình đang chạy Java bằng lệnh:

ps axf | grep java

+0

của nó không phải là Jim được yêu cầu, Ông được yêu cầu gỡ lỗi approch –

+0

@ user1348753, xem chỉnh sửa – aviad

+0

@aviad: Tôi đã thực hiện 'kill -3' và nạp javacore vào Samurai. Không có bảng trực quan nào chỉ là bản ghi nhật ký t.Làm cách nào tôi có thể theo dõi chuỗi từ báo cáo này? – Jim

2

Bạn nói quá trình java của bạn vẫn còn tồn tại, phải không? Quy trình tồn tại miễn là chúng có chủ đề kèm theo, phải không? Nếu vậy, tôi sẽ đi theo phương pháp sau: - chạy quy trình với máy chủ MBean được đính kèm và quản lý nội bộ bằng JVM

Sau đó kết nối với quá trình sau khi bạn gửi tín hiệu QUIT và nhận kết xuất chuỗi (có phải là một JMX cho điều đó. Xem những chủ đề tìm kiếm đáng ngờ cho bạn.

tôi nghĩ bạn cũng có thể sử dụng JVisualVM lấy chủ đề bãi ...

+0

Tôi không biết cách thực hiện các phương pháp bạn đề xuất – Jim

+0

Điều này trông dễ dàng hơn, nhưng đã được đề xuất bởi aviad :): http://www.crazysquirrel.com/computing/java/basics/java-thread-dump.jspx –

+0

Đối với phương pháp JVisualVM - đây là hướng dẫn http://docs.oracle.com /javase/6/docs/technotes/guides/visualvm/threads.html. Về cơ bản jvisualvm chỉ là một tập tin thực thi có thể được tìm thấy trong thư mục $ JAVA_HOME/bin ... chạy nó, kết nối với ứng dụng của bạn và xem những gì bạn có thể làm với nó. Khá mạnh mẽ, thực sự :) –