2012-07-25 24 views
8

Tôi muốn tạo một watchdog Nagios cho JVM trông khi JVM hết bộ nhớ và khởi động lại nó.Làm thế nào để khởi động lại JVM khi nó hết bộ nhớ bằng cách sử dụng giám sát JMX?

Hiện tại tôi đã có thể thiết lập JVM cho phép JMX nhưng tôi không biết cách phát hiện tình trạng OutOfMemory và khởi động lại nó.

/check_jmx -U service:jmx:rmi:///jndi/rmi://127.0.0.1:1100/jmxrmi -O "java.lang:type=Memory" -A "HeapMemoryUsage" -K used -I HeapMemoryUsage -J used -vvvv 
JMX OK HeapMemoryUsage.used=957414288{committed=2415984640;init=2147483648;max=2863333376;used=957414288} 

https://github.com/tcurdt/nagios-check-jmx

+1

thật không may, tiêu chuẩn jdk có cách _no_ để phát hiện rằng một jvm đã nhấn OOM. đã tự mình trải qua điều này trong sản phẩm của chúng tôi. tôi đã kết thúc việc cài đặt một trình xử lý ghi nhật ký để kiểm tra LogRecords có chứa một OOME. hoạt động miễn là không có mã nuốt Lỗi mà không báo cáo lỗi đó. – jtahlborn

+0

tôi đã tìm thấy một số API đầy hứa hẹn thông qua API công cụ java, nhưng tôi kết luận rằng bất kỳ giải pháp nào sẽ liên quan đến việc triển khai mã gốc trong một tác nhân dụng cụ, đó là "không đi" cho chúng tôi. – jtahlborn

Trả lời

1

Tôi không nghĩ rằng bạn đang đi để có thể phát hiện tình trạng out-of-bộ nhớ sử dụng JMX. Nếu JVM thực sự ở phần cuối của cuộc đời, kết nối JMX rất có thể sẽ tự ném OOM ngoại lệ khi bạn cố gắng kết nối.

Chúng tôi phát hiện cao điều kiện bộ nhớ thay vì OOM. Chúng tôi báo động khi bộ nhớ rảnh của hệ thống của chúng tôi đi dưới một số dấu nước trong một khoảng thời gian nhất định. Chúng tôi cũng có các chuỗi chạy để kết xuất các tệp số liệu trên mỗi phân phối. Vì luồng đã được cấp phát, nó có thể đổ thông tin bộ nhớ hệ thống một cách đáng tin cậy sau khi JVM hết.

Chúng tôi đăng nhập:

// free memory 
Runtime.getRuntime().freeMemory() 
// current heap usage 
Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory() 
+3

Nếu bạn muốn biết liệu bạn có bắt đầu chạy hết bộ nhớ có sẵn không, bạn sẽ không cần sử dụng 'Runtime.getRuntime(). MaxMemory()'? Vì 'totalMemory()' dựa trên những gì JVM có trong JVM tại thời điểm đó (tức là nó có thể phát triển). Về cơ bản bộ nhớ có sẵn sẽ là 'Runtime.getRuntime(). MaxMemory() - Runtime.getRuntime(). TotalMemory() + Runtime.getRuntime(). FreeMemory() '. –

12

Nếu bạn đang sử dụng Java 1.4.2 hoặc mới hơn, tùy chọn này cho phép bạn thực hiện một người sử dụng định nghĩa lệnh khi trừ OutOfMemeory đầu tiên xảy ra: -XX:OnOutOfMemoryError="<cmd args>;<cmd args>"

Đó nên cung cấp cho bạn một số tùy chọn phong nha. ví dụ. bạn có thể khởi động một kiểm tra thụ động để nagios nói với nó rằng máy chủ đang được khởi động lại, và sau đó khởi động một kịch bản lệnh shell để dừng/khởi động JVM sai của bạn.

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