Jak naprawić VirtualMachineError w Javie

Java.lang.VirtualMachineError jest generowany, gdy maszyna wirtualna Java napotka wewnętrzny błąd lub ograniczenie zasobów, które uniemożliwia jej działanie. Jest to mechanizm samoobrony zastosowany przez JVM, aby zapobiec awarii całej aplikacji. W tym artykule omówię wiele różnych typów VirtualMachineError, ich cechy, różne powody, dla których są one wyzwalane i kilka rozwiązań potencjałów, aby je naprawić.

typy VirtualMachineError

istnieją cztery różne typy VirtualMachineError:

  1. OutOfMemoryError
  2. StackOverflowError
  3. InternalError
  4. UnknownError

przejrzyjmy te typy szczegółowo w tej sekcji.

    Jax London
    Jax London 2019

    Emily Lannon

    DEVOPS nowej generacji: zarządzanie strumieniem wartości

    Helen Beal (DevOps Institute.)

    Emily Lannon

    jak rozwijać swój zespół bez serwera

    Sheen Brisals (Grupa LEGO)

    Emily Lannon

    MLOPS: ciągłe dostarczanie systemów uczenia maszynowego

    Hauke Brammer (finpair GmbH)

VirtualMachineError

: Java throwable class hierarchy

OutOfMemoryError

podobnie jak skrót OMG (Oh My God), OOM (OutOfMemoryError) jest dość popularny wśród społeczności DevOps. Podczas gdy większość inżynierów DevOps może myśleć, że istnieje tylko jeden OutOfMemoryError, w rzeczywistości istnieje osiem różnych smaków OutOfMemoryError:

  • java.lang.OutOfMemoryError: Java heap space
  • java.lang.OutOfMemoryError: GC Overhead limit exceeded
  • java.lang.OutOfMemoryError: wymagany rozmiar tablicy przekracza limit VM
  • java.lang.OutOfMemoryError: PermGen space
  • java.lang.OutOfMemoryError: Metaspace
  • java.lang.OutOfMemoryError:nie można utworzyć nowego natywnego wątku
  • java.lang.OutOfMemoryError: Kill process or sacrifice child
  • java.lang.OutOfMemoryError: reason stack_trace_with_native_method

każdy błąd jest wyzwalany z różnych powodów. Podobnie, rozwiązania tych błędów różnią się w zależności od rodzaju problemu OutOfMemoryError. Oto piękny jednostronicowy dokument, który podsumowuje różne rodzaje OutOfMemoryError, ich przyczyny i rozwiązania.

Ogólnie Rzecz Biorąc, OutOfMemoryError może być diagnozowany i naprawiany poprzez analizę dzienników zbierania śmieci i zrzutów sterty. Ponieważ ręczne analizowanie dzienników zbierania śmieci może być żmudne, możesz rozważyć użycie darmowych narzędzi, takich jak GCeasy, HP Jmeter lub IBM GC analyzer. Podobnie, możesz rozważyć użycie darmowych narzędzi, takich jak HeapHero lub Eclipse MAT do analizy zrzutów sterty.

Zobacz też: StackOverFlowError: Przyczyny & rozwiązania

StackOverflowError

stos wątku przechowuje informacje o metodach, które wykonuje, prymitywnych wartościach typu danych, zmiennych lokalnych, wskaźnikach obiektów i wartościach zwracanych. Wszystkie te rzeczy pochłaniają pamięć. Jeśli rozmiar stosu wątku przekracza limit przydzielonej pamięci, to Java.lang.Zostanie wyrzucony błąd StackOverflowError. Ten problem zwykle występuje, gdy wątek rekurencyjnie wywołuje tę samą funkcję ponownie i ponownie z powodu błędu w programie wykonującym. Więcej szczegółów na temat debugowania StackOverflowError i wszystkich możliwych rozwiązań, aby naprawić ITC tutaj.

InternalError

java.lang.InternalError jest wyrzucany przez JVM z trzech powodów. Jeśli wystąpi usterka w oprogramowaniu implementującym maszynę wirtualną, usterka w oprogramowaniu systemu hosta lub usterka sprzętu.

jednak rzadko spotyka się tego rodzaju InternalError. Aby zrozumieć, jakie konkretne scenariusze mogą powodować błąd InternalError, wyszukaj ciąg 'InternalError’ w bazie danych błędów Java firmy Oracle. W momencie pisania tego artykułu (20 grudnia 2018 r.) w bazie danych błędów Java Oracle zgłoszono tylko 200 usterek tego błędu. Większość z nich jest naprawiona. Więc nie martw się zbytnio tym!

UnknownError

java.lang.UnknownError jest generowany, gdy wystąpił wyjątek lub błąd, ale maszyna wirtualna Java nie jest w stanie zgłosić rzeczywistego wyjątku lub błędu. UnknownError rzadko występuje. W rzeczywistości podczas wyszukiwania „UnknownError” w bazie danych Oracle Java Bug database zgłoszono tylko 2 usterki.

ZOBACZ: Zdalne debugowanie dla aplikacji Java

charakterystyka

VirtualMachineError ma kilka podstawowych cech:

  • niezaznaczone wyjątki
  • synchroniczne & asynchroniczne dostarczanie

omówmy te dwie cechy w tej sekcji.

niezaznaczone wyjątki

istnieją dwa typy WYJĄTKÓW: zaznaczone i niezaznaczone.

wyjątki, które są sprawdzane podczas kompilacji, są nazywane wyjątkami Sprawdzanymi. Jeśli niektóre metody w kodzie wywołują wyjątek checked, to metoda musi albo obsłużyć wyjątek, albo musi określić wyjątek za pomocą słowa kluczowego „throws”. Przykładami sprawdzonych WYJĄTKÓW są: IOException, SqlException, DataAccessException, ClassNotFoundException i inne.

niezaznaczone wyjątki nie mają tego wymogu. Nie trzeba ich łapać ani wyrzucać. Wszystkie typy VirtualMachineError są wyjątkami niezaznaczonymi.

synchroniczne &dostarczanie asynchroniczne

wyjątki można zgłaszać w dwóch trybach: synchronicznym i asynchronicznym.

synchroniczne wyjątki zdarzają się w określonej instrukcji programu, bez względu na to, ile razy program był wykonywany w podobnym środowisku. Przykładami WYJĄTKÓW synchronicznych są takie rzeczy jak NullPointerException, ArrayIndexOutOfBoundException itp.

asynchroniczne wyjątki mogą wystąpić w dowolnym momencie i w dowolnej części instrukcji programu. Nie ma spójności, gdzie można go rzucić. Wszystkie VirtualMachineErrors są wyrzucane asynchronicznie, ale czasami mogą być również wyrzucane synchronicznie. Błąd StackOverflowError może być wyrzucany synchronicznie przez wywołanie metody, jak również asynchronicznie z powodu natywnego wykonywania metod lub ograniczeń zasobów maszyny wirtualnej Java. Podobnie, OutOfMemoryError może być wyrzucany synchronicznie podczas tworzenia obiektu, tworzenia tablicy, inicjalizacji klasy i konwersji boksu, a także asynchronicznie.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.

Previous post Poradnia afroamerykańska
Next post Czy Schizofrenicy Są Niebezpieczni?