2009-12-07 27 views
6

Tôi nên làm gì (như một lập trình viên Java không biết gì về nội bộ JVM) khi tôi gặp sự cố JVM?Tôi nên chẩn đoán và ngăn ngừa sự cố JVM như thế nào?

Cụ thể, bạn sẽ tạo ra một trường hợp thử nghiệm tái sản xuất như thế nào? Tôi nên tìm gì trong cơ sở dữ liệu lỗi của Sun (hoặc IBM)? Tôi có thể lấy thông tin gì từ các tệp nhật ký được tạo (ví dụ: hs_err_pidXYZ.log)?

+0

JVM tai nạn là cực kỳ hiếm những ngày này, nó bây giờ khá nghiêm trọng. Tôi đề nghị đăng ở đây đầu ra của các bản ghi khi nó bị treo. – skaffman

Trả lời

7

Nếu sự cố chỉ xảy ra với một máy cụ thể, hãy chạy memtest. Tôi đã nhìn thấy JVM định kỳ bị treo chỉ hai lần, và trong cả hai trường hợp thủ phạm hóa ra là một vấn đề phần cứng, cụ thể là RAM bị lỗi.

+0

+1 cho phần cứng bị lỗi là ứng cử viên chính. Lỗi sửa ram là một điều tốt. –

+0

+1 Sửa phần cứng của bạn. –

+0

Chấp nhận vì nó không phải là điều tôi đã xem xét, và cũng có thể là câu trả lời. –

0

Khi một JVM iBM gặp sự cố, có thể nó đã ghi vào tệp /tmp/dump_locations trong đó liệt kê bất kỳ tệp heapdump hoặc javacore nào mà tệp đã viết.

Các tệp này có thể được phân tích bằng cách sử dụng Java Core AnalyzerJava heapdump Analyzer từ bảng chữ cái của IBM.

+0

Đây có phải là điều tôi có thể làm nếu tôi không biết gì về nội bộ JVM không? –

+0

Có, các trình phân tích trình bày các luồng, khóa và các khóa chết có thể cho lõi Java và cây đối tượng và các rò rỉ bộ nhớ có thể xảy ra cho vùng heap Java. Cả hai có thể chỉ cho bạn các nguồn rắc rối. – rsp

2

Mặt trời ghi chi tiết nhật ký sự cố here. Ngoài ra còn có một hướng dẫn tốt đẹp được viết lên here, nếu bạn muốn nhận được vào các chi tiết bẩn (có vẻ như bạn không, mặc dù)

Tuy nhiên, như một bình luận đã đề cập, một vụ tai nạn JVM là khá hiếm và nghiêm trọng sự kiện, và nó có thể là đáng giá để gọi Sun hoặc IBM hỗ trợ chuyên nghiệp trong tình huống này.

5
  1. Theo kinh nghiệm của tôi, chúng hầu như luôn luôn do mã gốc sử dụng JNI, hoặc của tôi hoặc của người khác. Nếu bạn có thể, hãy thử chạy lại mà không có mã gốc để xem liệu bạn có thể tái tạo nó hay không.

  2. Đôi khi nó đáng để thử với the JIT compiler turned off, nếu lỗi của bạn dễ tái sản xuất.

  3. Như những người khác đã chỉ ra, phần cứng bị lỗi cũng có thể gây ra điều này, tôi đã nhìn thấy nó cho cả thẻ nhớ và video (khi tai nạn đang ở trong mã swing). Hãy thử chạy bất kỳ chẩn đoán phần cứng nào thích hợp nhất cho hệ thống của bạn.

  4. Vì sự cố JVM hiếm khi tôi báo cáo chúng cho Sun. Điều này có thể được thực hiện tại số bug database của họ. Sử dụng danh mục Java SE, Tiểu thể loại jvm_exact hoặc jit.

  5. Trong Unix/Linux, bạn có thể nhận được kết xuất Lõi. Dưới cửa sổ JVM thường sẽ cho bạn biết nơi nó đã lưu trữ một bản ghi về những gì đã xảy ra. Các tệp này thường đưa ra một số gợi ý, nhưng sẽ thay đổi từ JVM sang JVM. Mặt trời cung cấp đầy đủ chi tiết của các tệp này on their website. hoặc IBM, các tệp có thể được phân tích bằng cách sử dụng các số Java Core AnalyzerJava heapdump Analyzer từ các bảng chữ cái của IBM.

  6. Thật không may, các trình gỡ lỗi Java trong kinh nghiệm của tôi có xu hướng làm tổn thương nhiều hơn trợ giúp. Tuy nhiên, việc gắn một trình gỡ lỗi cụ thể cho hệ điều hành (ví dụ Visual Studio) có thể giúp ích nếu bạn quen thuộc với việc đọc các dấu vết ngăn xếp C.

Cố gắng để có được một trường hợp thử nghiệm có thể lặp lại là khó. Nếu bạn có một số lượng lớn mã luôn luôn (hoặc gần như luôn luôn) tai nạn nó là dễ dàng hơn, chỉ cần từ từ loại bỏ các bộ phận trong khi nó tiếp tục bị rơi, nhận được kết quả càng nhỏ càng tốt. Nếu bạn không có mã thử nghiệm có thể tái sản xuất thì rất khó. Tôi muốn gợi ý gợi ý từ lựa chọn được đánh số của tôi ở trên.

Các vấn đề liên quan