Wo werden Ausnahmen gespeichert? Stapel, Haufen. Wie wird Speicher für Ausnahmen zugewiesen und freigegeben? Wenn nun mehr als eine Ausnahme behandelt werden muss, werden Objekte all dieser Ausnahmen erstellt?
Ich würde annehmen, dass Speicher für Ausnahmen genauso wie für alle anderen Objekte (auf dem Heap) zugewiesen wird.
Das war früher ein Problem, weil Sie dann keinen Speicher für einen OutOfMemoryError zuweisen können, Aus diesem Grund gab es keine Stapelverfolgung bis Java 1.6 . Jetzt reservieren sie auch Speicherplatz für den Stacktrace.
Wenn Sie sich fragen, wo der Verweis auf die Ausnahme gespeichert wird, während sie geworfen wird, behält die JVM den Verweis intern bei, während sie den Aufrufstapel abwickelt, um den Ausnahmebehandler zu finden Referenz (auf seinem Stapelrahmen, genau wie jede andere lokale Variable).
Es können nicht zwei Ausnahmen gleichzeitig ausgelöst werden (im selben Thread). Sie können verschachtelt sein, aber dann haben Sie nur eine "aktive" Ausnahme mit einem Verweis auf die verschachtelte Ausnahme.
Wenn alle Verweise auf die Ausnahme verschwinden (z. B. nachdem der Ausnahmebehandler beendet wurde), wird die Ausnahme wie alles andere in den Garbage-Collected-Modus versetzt.
Für C ++ ist nicht definiert, wo Ausnahmen gespeichert werden sollen, aber die meisten Compiler verwenden einen speziellen Stapel. Für Java, wie jemand zuvor geschrieben hat, werden sie auf dem Heap gespeichert.
Da es sich um Ausnahmen in C ++ und Java handelt, werden sie als Objekte in der jeweiligen Sprache zugewiesen und freigegeben.
In beiden Sprachen ist immer nur eine Ausnahme pro Thread aktiv.
Für die vollständigsten Informationen zu Ausnahmen können wir direkt zur Quelle gehen: Kapitel 11: Ausnahmen von Java Language Specification, Second Ausgabe .
Ausnahmen sind in der Tat Objekte. Sie sind eine Unterklasse von Throwable
:
Jede Ausnahme wird durch ein dargestellt Instanz der Klasse Throwable oder eins seiner Unterklassen; so ein Objekt kann verwendet werden, um Informationen von der Punkt, an dem eine Ausnahme auftritt der Handler, der es fängt.
Daher wäre es wahrscheinlich sicher anzunehmen, dass es wie bei jedem anderen Object
in Java auf dem Heap zugewiesen wird.
In Bezug auf das Vorhandensein mehrerer Exception
-Objekte wäre dies wahrscheinlich nicht der Fall. Sobald eine Ausnahme auftritt, sucht die Java Virtual Machine nach einem Ausnahmebehandler.
Während des Wurfes eines Ausnahme, die Java Virtual Machine abrupt vervollständigt, eins nach dem anderen, any Ausdrücke, Aussagen, Methode und Konstruktoraufrufe, Initialisierer, und Feldinitialisierungsausdrücke das hat begonnen, aber nicht abgeschlossen Ausführung im aktuellen Thread. Dies Prozess wird fortgesetzt, bis ein Handler ist gefunden, die angibt, dass es behandelt diese besondere Ausnahme durch Benennung die Klasse der Ausnahme oder a Oberklasse der Klasse der Ausnahme.
Weitere Informationen dazu, wie Ausnahmen zur Laufzeit behandelt werden, finden Sie Abschnitt 11.3 Behandlung einer Ausnahme enthält die Details.
Ausnahmen in Java sind Objekte und als solche werden sie auf dem Heap gespeichert.
Wenn eine Ausnahme ausgelöst wird, sucht die JVM im Code nach einem passenden Ausnahmebehandler. Dies gilt auch dann, wenn es mehrere Ausnahmen gibt, die etwas auslösen könnte.
Wo werden Ausnahmen gespeichert? Stapel, Haufen. Wie ist der Speicher zugeordnet und für Ausnahmen freigegeben?
Ausnahmen sind Objekte wie alle anderen in dieser Hinsicht. Wird auf dem Heap über new
zugewiesen und durch den Garbage Collector nicht freigegeben.
Wenn Sie jetzt mehr als eins haben Ausnahme, die behandelt werden muss gibt es Objekte von all diesen Ausnahmen erstellt?
Nicht sicher, was du damit meinst. Sie werden einzeln über new
erstellt. Es kann mehr als einen geben, wenn Sie eine Ausnahmekette verwenden - und es gibt nichts, was Sie davon abhält, Tausende von Ausnahmen zu erstellen und sie irgendwo in eine Liste zu setzen - das macht einfach keinen Sinn.
In Java erweitert Exception Throwable, wodurch Object erweitert wird. aus Sicht des Speichers ist es ein Objekt wie jedes andere.
In Java 7 wurde vorgeschlagen, dass lokale Variablen mithilfe der Escape-Analyse auf dem Stack platziert werden können, um Kandidaten für Stack-Variablen zu finden. Ausnahmen werden jedoch normalerweise von einer Methode an einen Aufrufer (oder seinen Aufrufer usw.) gesendet, so dass es nicht sehr nützlich wäre, die Ausnahme auf den Stapel zu legen.