2009-03-01 10 views
6

Tôi đã sử dụng trình bao bọc dịch vụ Java trong một ứng dụng tùy chỉnh trong một thời gian và nó hoạt động tốt. Kể từ khi cập nhật ứng dụng của chúng tôi lên phiên bản mới trong vài ngày qua, JVM bắt đầu treo và sau đó trình bao bọc in bản ghi này trong nhật ký: JVM xuất hiện treo: Đã hết thời gian chờ tín hiệu từ JVM.Java xuất hiện treo

Sau đó, nó sẽ tự động chấm dứt JVM và khởi động lại ứng dụng. Điều này xảy ra sau khoảng 10 giờ chạy, điều này khiến cho việc gỡ lỗi trở nên khó khăn hơn.

Tất nhiên tôi sẽ xem xét các thay đổi mà chúng tôi đã thực hiện, nhưng không có thay đổi lớn nào được thực hiện mà tôi nghi ngờ sẽ gây ra loại sự cố này.

Tôi có thể tìm cách thử và tìm hiểu xem điều gì đang xảy ra ở đâu? Gỡ lỗi tin nhắn từ ứng dụng không cho biết bất kỳ điều gì thú vị. Nếu JVM chỉ gặp sự cố, nó thường sẽ tạo ra một kết xuất, có thể giúp gỡ lỗi nó, nhưng nó treo, vì vậy nó không tạo ra một bãi chứa. Nếu tôi làm cho nó không khởi động lại dịch vụ tự động là có bất cứ điều gì tôi có thể làm để có được một số thông tin hữu ích ra khỏi JVM trước khi khởi động lại nó?

Dường như với tôi rằng JVM không được treo từ lỗi lập trình điển hình. Những gì bạn đã chạy vào trước đó có thể gây ra JVM để treo?

Trả lời

1

Tôi có một vài phiên bản khác nhau của thư viện trên classpath (JBPM). Với trình bao bọc, bạn có thể sử dụng các ký tự đại diện để bao gồm các lọ. Hãy cẩn thận với điều này mặc dù như bạn có thể vô tình bao gồm nhiều hơn bạn nên.

Đây là bài viết của IBM cung cấp thông tin trên debugging hangs in Java. Về cơ bản nó nói rằng có hai điều có thể gây treo:

  1. Một vòng lặp vô hạn,
  2. Một bế tắc.

Kể từ đó, tôi phải gỡ lỗi các sự cố treo khác. Trên linux, bạn có thể gửi JVM tín hiệu QUIT để làm cho nó thực hiện một chuỗi kết xuất tới bàn điều khiển. Điều này thực sự giúp tìm ra vấn đề ở đâu. Sử dụng lệnh này để làm điều đó: giết -QUIT

Sửa 6/13/2017

Những ngày này tôi sử dụng jmap bao gồm trong JDK để đổ toàn bộ bộ nhớ của chương trình. Sau đó, tôi sử dụng Bộ phân tích bộ nhớ Eclipse để xem trạng thái chính xác của chương trình khi nó bị lỗi. Bạn có thể xem danh sách các chủ đề đang hoạt động và sau đó kiểm tra các biến trong mỗi khung ngăn xếp.

/usr/java/latest/bin/jmap -dump:file=/tmp/app-crash.hprof <PID> 

Trong đó PID là ID tiến trình của quá trình java.

1

Bạn đang ở trong môi trường nào? OS, phiên bản JVM, kiến ​​trúc phần cứng?

Điều đó nghe có vẻ giống như một lỗi và phải mất nhiều giờ, âm thanh đó giống như một lỗi cạn kiệt tài nguyên của một số loại.

+0

Linux RHEL4, Java 1.6.0, Intel 32 bit. Tôi đang theo dõi số lượng chủ đề và cách sử dụng bộ nhớ; cho đến nay nó không sử dụng nhiều. Chúng tôi không sử dụng nhiều chủ đề. Chúng tôi chỉ khởi động một vài ứng dụng trong thời gian bắt đầu để xem xét từng phút để xem liệu có điều gì đó cần xử lý hay không. –

+0

mức độ phù hợp là 10 giờ? Có thực sự chỉ có một vài khả năng: hoặc một số * cạn kiệt tài nguyên, hoặc một bế tắc ngẫu nhiên/chậm trễ. Loại ứng dụng nào? –

+0

Không nhất quán chút nào. Cho đến nay nó chỉ xảy ra ba lần. Trên thực tế, có vẻ như mức trung bình cao hơn một chút so với 10 giờ. Nó xảy ra lúc 12, 14 và 19 giờ. Những gì tôi sẽ cố gắng và làm là đặt nó để không tự động khởi động lại để tôi có thể điều tra trạng thái một chút khi nó xảy ra. –

8

Đọc trên wrapper.ping.timeout property. Phần mềm bao bọc giao tiếp với JVM của bạn thường xuyên để đảm bảo rằng nó vẫn còn hoạt động. Nếu giao tiếp đó không thành công vì bất kỳ lý do gì, trình bao bọc sẽ coi quá trình treo và cố gắng khởi động lại nó.

Tùy thuộc vào cách ứng dụng của bạn được kiến ​​trúc, JVM của bạn có thể đang bận xử lý một thứ khác khi trình bao bọc cố gắng "ping" nó.

+0

Việc tăng thuộc tính có thể khiến trình bao bọc không nhận thấy được sự cố và không khởi động lại ứng dụng, nhưng đó chỉ là vấn đề xung quanh vấn đề. Trong thời gian treo nó sẽ không đáp ứng yêu cầu của khách hàng, điều đó cũng không tốt. –

2

Xem bạn có thể sử dụng số Visual VM để xem điều gì đang xảy ra không. Có Visual VM giám sát các ứng dụng cho toàn bộ thời gian và khi nó ngừng làm việc có lẽ bạn có thể xác định những gì là sai.

Nếu VM bị treo, bạn có thể nhận trạng thái của chủ đề ... Tôi nghĩ rằng Visual VM sẽ làm cho nó dễ dàng hơn một chút cho thiết lập của bạn hơn bình thường ctrl-break (hoặc whatver tổ hợp phím).

(Chỉnh sửa dựa trên nhận xét)

Cố gắng này. Lần cuối cùng nó treo số lượng chủ đề và số lượng bộ nhớ được sử dụng khá thấp, vì vậy, không ai trong số đó gây ra sự cố . Thật không may sau khi nó treo và trình bao bọc chấm dứt nó, bạn không thể nhận được kết xuất chuỗi.

Có cách nào bạn có thể chạy mà không có trình bao bọc để gỡ lỗi không? Ngoài ra nếu bạn sử dụng hồ sơ NetBeans nó có thể cung cấp cho bạn một cơ hội để đối phó với nó khi nó dừng lại (tôi sẽ kiểm tra sau ngày hôm nay và xem nếu tôi có thể tìm hiểu nếu điều đó sẽ hành xử khác nhau).

+0

Đã thử điều này. Thời gian qua nó treo số lượng các chủ đề và số lượng bộ nhớ được sử dụng là khá thấp, do đó, không phải của những người đang gây ra vấn đề. Thật không may sau khi nó treo và wrapper chấm dứt nó, bạn không thể có được một bãi chứa thread. –