2015-05-29 31 views
8

Wiem o parametrze JVM -XX:+HeapDumpOnOutOfMemoryError. Wiem też o -XX:OnOutOfMemoryError="cmd args;cmd args" i że kill -3 <JVM_PID> zażąda zrzutu sterty.Jak ponownie uruchomić maszynę JVM w OutOfMemoryError _ po zrobieniu zrzutu sterty?

Pytanie: W jaki sposób można się upewnić, że na OutOfMemoryError najpierw zrobić pełny zrzut sterty i następnie siły restartu (lub zabić) po zrzut odbywa? Czy mój najlepszy zakład to -XX:OnOutOfMemoryError="kill -3 %p;sleep <time-it-takes-to-dump>;kill -9 %p"?

+2

Czy nie byłoby lepiej, aby monitorować proces od bez JVM i ponownie go odpowiednio, na przykład skrypt unix, system monitoryzacji? jeśli jvm jest poza pamięcią, nie chciałbym na nim polegać, aby móc niezawodnie uruchomić polecenie ponownego uruchomienia – vikingsteve

Odpowiedz

15
java -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError="kill -9 %p" TestApp 

JVM będzie zrzucić sterty pierwszy, a następnie wykonać polecenia OnOutOfMemoryError (proof).

0

Założę się, że środowisko wykonawcze ustawia określony poziom błędu podczas awarii. Sprawdź ten kod powrotu i ponownie uruchom program. Powinieneś umieścić to w scenariuszu.

Sun jre pozwala na stertę zrzutu na oome, być może openjdk też.

4

Jeśli chcesz tylko do wyłączenia można użyć jednego z następujących parametrów:

  • -XX:+ExitOnOutOfMemoryError
  • -XX:+CrashOnOutOfMemoryError

Argumenty VM dodano Java wersji 8u92, zobacz release notes.

ExitOnOutOfMemoryError
Po włączeniu tej opcji, JVM wychodzi na pierwszego wystąpienia out-of-memory błędu. Można go użyć, jeśli użytkownik woli zrestartować instancję maszyny JVM niż obsługiwać błędy pamięci o wartości od .

CrashOnOutOfMemoryError
Jeśli ta opcja jest włączona, gdy wystąpi błąd out-of-pamięci, awarie JVM i produkuje tekst i binarne pliki zderzeniowych.

Enhancement Zapytanie: JDK-8138745 (parametr nazewnictwa jest źle choć JDK-8154713, ExitOnOutOfMemoryError zamiast ExitOnOutOfMemory)