2012-07-25 10 views
8

Chcę utworzyć watchdog nagios dla JVM, który wygląda, gdy JVM kończy się pamięć i uruchamia ponownie.Jak zrestartować JVM, gdy zabraknie mu pamięci przy użyciu monitorowania JMX?

Obecnie mogłem skonfigurować JVM, aby umożliwić JMX, ale nie wiem, jak wykryć warunek OutOfMemory i uruchom go ponownie.

/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

Niestety, standardowy jdk ma _nie_ możliwość wykrycia, że ​​jvm trafił OOM. przeżyłem to sam w naszym produkcie. w końcu zainstalowałem program obsługi rejestrowania, który sprawdza LogRecords, które zawierają OOME. działa tak długo, jak żaden kod nie połknie błędu bez zgłoszenia go. – jtahlborn

+0

Znalazłem obiecujące API za pośrednictwem interfejsu API java tooling, ale doszedłem do wniosku, że każde rozwiązanie wymagałoby implementacji natywnego kodu w narzędziu narzędziowym, co było dla nas "nie do przyjęcia". – jtahlborn

Odpowiedz

1

nie sądzę, masz zamiar być w stanie wykryć stan out-of-memory użyciu JMX. Jeśli JVM jest naprawdę na końcu swojego życia, połączenia JMX najprawdopodobniej same będą powodowały wyjątki OOM przy próbie połączenia.

Wykrywamy warunki pamięci wysokiej zamiast OOM. Alarmujemy, kiedy wolna pamięć naszego systemu spada poniżej pewnego znaku wody przez pewien czas. Mamy też wątki, które uruchamiają się, by zrzucać pliki danych z podziałem na serwery. Ponieważ wątek jest już przydzielony, może niezawodnie zrzucać informacje o pamięci systemowej po wyczerpaniu maszyny JVM.

Logujemy:

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

Jeśli chcesz się dowiedzieć, czy zaczynasz brakować dostępnej pamięci, czy nie musisz użyć 'Runtime.getRuntime(). MaxMemory()'? Ponieważ 'totalMemory()' jest oparte na tym, co JVM ma w JVM w tym momencie (tzn. Może się rozwijać). Zasadniczo dostępna pamięć to "Runtime.getRuntime(). MaxMemory() - Runtime.getRuntime(). TotalMemory() + Runtime.getRuntime(). FreeMemory() '. –

12

Jeśli używasz Java 1.4.2 lub nowszej, opcja ta pozwala na wykonanie komendy zdefiniowanej przez użytkownika, gdy wystąpi pierwszy OutOfMemeory wyjątek: -XX:OnOutOfMemoryError="<cmd args>;<cmd args>"

które powinny dać ci przyzwoite opcje. na przykład możesz zacząć od pasywnego czeku do nagios, aby powiedzieć, że serwer jest restartowany, a następnie uruchomić skrypt powłoki, aby zatrzymać/uruchomić błędną maszynę JVM.

Powiązane problemy