Java.lang.VirtualMachineError wird ausgelöst, wenn eine Java Virtual Machine auf einen internen Fehler oder eine Ressourcenbeschränkung stößt, die die Funktion verhindert. Es ist ein Selbstverteidigungsmechanismus, der von der JVM verwendet wird, um zu verhindern, dass die gesamte Anwendung abstürzt. In diesem Artikel werde ich die vielen verschiedenen Arten von VirtualMachineError, ihre Eigenschaften, verschiedene Gründe, warum sie ausgelöst werden, und verschiedene mögliche Lösungen, um sie zu beheben, diskutieren.
Arten von VirtualMachineError
Es gibt vier verschiedene Arten von VirtualMachineError:
- OutOfMemoryError
- StackOverflowError
- InternalError
- UnknownError
Lassen Sie uns diese Typen in diesem Abschnitt im Detail überprüfen.
DEVOPS DER NÄCHSTEN GENERATION: WERTSTROMMANAGEMENT
Helen Beal (DevOps Institute.)
SO ERWEITERN SIE IHR SERVERLOSES TEAM
Sheen Brisals (Die LEGO Gruppe)
MLOPS: CONTINUOUS DELIVERY VON MACHINE LEARNING SYSTEMEN
Hauke Brammer (finpair GmbH)
Abb: Java throwable class hierarchy
OutOfMemoryError
Genau wie das Akronym OMG (Oh My God) ist OOM (OutOfMemoryError) in der DevOps-Community sehr beliebt. Während die meisten DevOps-Ingenieure denken, dass es nur einen OutOfMemoryError gibt, gibt es tatsächlich acht verschiedene Varianten von OutOfMemoryError:
- java.lang.OutOfMemoryError: Java-Heap-Speicherplatz
- java.lang.OutOfMemoryError: GC-Overhead-Grenze überschritten
- java.lang.OutOfMemoryError: Die angeforderte Array-Größe überschreitet das VM-Limit
- java.lang.OutOfMemoryError: Permgen Raum
- java.lang.OutOfMemoryError: Metaspace
- java.lang.OutOfMemoryError: Neuer nativer Thread kann nicht erstellt werden
- java.lang.OutOfMemoryError: Prozess beenden oder Kind opfern
- java.lang.OutOfMemoryError: Grund stack_trace_with_native_method
Jeder Fehler wird aus verschiedenen Gründen ausgelöst. In ähnlicher Weise unterscheiden sich die Lösungen für diese Fehler je nach Art des OutOfMemoryError-Problems. Hier ist ein schönes einseitiges Dokument, das alle verschiedenen Arten von OutOfMemoryError, ihre Ursachen und Lösungen zusammenfasst.
Im Allgemeinen kann OutOfMemoryError durch Analysieren von Speicherbereinigungsprotokollen und Heap-Dumps diagnostiziert und behoben werden. Da die manuelle Analyse von Garbage Collection-Protokollen mühsam sein kann, können Sie kostenlose Tools wie GCeasy, HP Jmeter oder IBM GC Analyzer verwenden. Ebenso können Sie kostenlose Tools wie HeapHero oder Eclipse MAT verwenden, um Heap-Dumps zu analysieren.
SIEHE AUCH: StackOverflowError: Ursachen & Lösungen
StackOverflowError
Der Stack-Stack eines Threads speichert Informationen zu den ausgeführten Methoden, primitiven Datentypwerten, lokalen Variablen, Objektzeigern und Rückgabewerten. All diese Dinge verbrauchen Speicher. Wenn die Stapelgrößen eines Threads über das zugewiesene Speicherlimit hinausgehen, wird Java.lang.StackOverflowError wird ausgelöst. Dieses Problem tritt normalerweise auf, wenn ein Thread dieselbe Funktion aufgrund eines Fehlers im ausführenden Programm immer wieder rekursiv aufruft. Weitere Details zum Debuggen von StackOverflowError und alle möglichen Lösungen zur Behebung finden Sie hier.
Interner Fehler
java.lang.InternalError wird von JVM aus drei Gründen ausgelöst. Wenn ein Fehler in der Software vorliegt, die die virtuelle Maschine implementiert, ein Fehler in der zugrunde liegenden Hostsystemsoftware oder ein Fehler in der Hardware.
Es ist jedoch selten, dass diese Art von InternalError auftritt. Um zu verstehen, welche spezifischen Szenarien InternalError verursachen können, suchen Sie in der Java-Fehlerdatenbank von Oracle nach der Zeichenfolge ‚InternalError‘. Zum Zeitpunkt des Schreibens dieses Artikels (20. Dezember 2018) wurden nur 200 Fehler für diesen Fehler in der Java-Fehlerdatenbank von Oracle gemeldet. Die meisten von ihnen sind fixiert. Also, mach dir nicht zu viele Sorgen um diesen!
Unbekannter Fehler
java.lang.UnknownError wird ausgelöst, wenn eine Ausnahme oder ein Fehler aufgetreten ist, die Java Virtual Machine jedoch die tatsächliche Ausnahme oder den tatsächlichen Fehler nicht melden kann. Der unbekannte Fehler tritt selten auf. Tatsächlich wurden bei der Suche nach ‚UnknownError‘ in der Oracle Java Bug-Datenbank nur 2 Fehler gemeldet.
SIEHE AUCH: Remote-Debugging für Java-Anwendungen
Eigenschaften
VirtualMachineError hat einige Hauptmerkmale:
- Ungeprüfte Ausnahmen
- Synchron & asynchrone Zustellung
Lassen Sie uns diese beiden Merkmale in diesem Abschnitt besprechen.
Ungeprüfte Ausnahmen
Es gibt zwei Arten von Ausnahmen: aktiviert und deaktiviert.
Ausnahmen, die zur Kompilierungszeit geprüft werden, werden als geprüfte Ausnahme bezeichnet. Wenn einige Methoden in Ihrem Code eine geprüfte Ausnahme auslösen, muss die Methode entweder die Ausnahme behandeln oder die Ausnahme mit dem Schlüsselwort ‚throws‘ angeben. Beispiele für die überprüften Ausnahmen sind: IOException, SQLException, DataAccessException, ClassNotFoundException und mehr.
Ungeprüfte Ausnahmen haben diese Anforderung nicht. Sie müssen nicht gefangen oder als geworfen deklariert werden. Alle Arten von VirtualMachineError sind ungeprüfte Ausnahmen.
Synchron & asynchrone Zustellung
Ausnahmen können in zwei Modi ausgelöst werden: synchron und asynchron.
Synchrone Ausnahmen treten bei einer bestimmten Programmanweisung auf, unabhängig davon, wie oft das Programm in einer ähnlichen Umgebung ausgeführt wurde. Beispiele für synchrone Ausnahmen sind Dinge wie NullPointerException, ArrayIndexOutOfBoundException usw.
Asynchrone Ausnahmen können zu jedem Zeitpunkt und in jedem Teil der Programmanweisung auftreten. Es gibt keine Konsistenz, wo es geworfen werden kann. Alle VirtualMachineErrors werden asynchron ausgelöst, manchmal können sie aber auch synchron ausgelöst werden. StackOverflowError kann sowohl synchron durch Methodenaufruf als auch asynchron aufgrund nativer Methodenausführung oder Ressourcenbeschränkungen für Java Virtual Machine ausgelöst werden. In ähnlicher Weise kann OutOfMemoryError synchron während der Objekterstellung, Array-Erstellung, Klasseninitialisierung und Boxing-Konvertierung sowie asynchron ausgelöst werden.