Beispielsweise:
class A {
static int i=0;
static int j;
static void method() {
// static k=0; can't use static for local variables only final is permitted
// static int L;
}
}
Wo werden diese Variablen in Java, im Heap oder im Stack-Speicher gespeichert? Wie werden sie gespeichert?
Antworten:
Statische Methoden (tatsächlich alle Methoden) sowie statische Variablen werden im
PermGen
Abschnitt des Heaps gespeichert , da sie Teil der Reflexionsdaten sind (klassenbezogene Daten, nicht instanzbezogene Daten).Update zur Verdeutlichung :
Beachten Sie, dass nur die Variablen und ihre technischen Werte (Grundelemente oder Referenzen) im PermGen-Bereich gespeichert werden.
Wenn Ihre statische Variable eine Referenz auf ein Objekt ist, wird dieses Objekt selbst in den normalen Abschnitten des Heapspeichers (junge / alte Generation oder Überlebensbereich) gespeichert. Diese Objekte (es sei denn, es handelt sich um interne Objekte wie Klassen usw.) werden nicht im PermGen-Bereich gespeichert.
Beispiel:
Ein Wort zur Müllabfuhr:
Verlassen Sie sich nicht darauf,
finalize()
da die Ausführung nicht garantiert ist. Es liegt ganz bei der JVM, zu entscheiden, wann der Garbage Collector ausgeführt werden soll und was gesammelt werden soll, selbst wenn ein Objekt für die Garbage Collection geeignet ist.Natürlich können Sie eine statische Variable auf null setzen und so den Verweis auf das Objekt auf dem Heap entfernen, aber das bedeutet nicht, dass der Garbage Collector ihn sammelt (auch wenn keine Referenzen mehr vorhanden sind).
Darüber hinaus
finalize()
wird es nur einmal ausgeführt, sodass Sie sicherstellen müssen, dass keine Ausnahmen ausgelöst werden oder das Sammeln des Objekts auf andere Weise verhindert wird. Wenn Sie die Finalisierung aufgrund einer Ausnahme anhalten,finalize()
wird sie nicht ein zweites Mal für dasselbe Objekt aufgerufen.Ein letzter Hinweis : Wie Code, Laufzeitdaten usw. gespeichert werden, hängt von der verwendeten JVM ab, dh HotSpot kann dies anders als JRockit tun und dies kann sogar zwischen Versionen derselben JVM unterschiedlich sein. Das Obige basiert auf HotSpot für Java 5 und 6 (diese sind im Grunde gleich), da ich zum Zeitpunkt der Beantwortung sagen würde, dass die meisten Leute diese JVMs verwendet haben. Aufgrund wesentlicher Änderungen im Speichermodell ab Java 8 gelten die obigen Aussagen möglicherweise nicht für Java 8 HotSpot - und ich habe die Änderungen von Java 7 HotSpot nicht überprüft, sodass ich denke, dass die obigen Aussagen für diese Version immer noch zutreffen. aber ich bin mir hier nicht sicher.
quelle
Klassenvariablen (statische Variablen) werden als Teil der
Class object
dieser Klasse zugeordneten Variablen gespeichert . Dieses Klassenobjekt kann nur von JVM erstellt und in gespeichert werdenpermanent generation
.Auch einige haben geantwortet, dass es in einem Nicht-Heap-Bereich gespeichert ist, der heißt
Method Area.
Auch diese Antwort ist nicht falsch. Es ist nur ein umstrittenes Thema, ob Permgen Area ein Teil von Heap ist oder nicht. Offensichtlich unterscheiden sich die Wahrnehmungen von Person zu Person. Meiner Meinung nach stellen wir Heap-Speicher und Permgen-Speicher in JVM-Argumenten unterschiedlich zur Verfügung. Es ist also eine gute Annahme, sie anders zu behandeln.Eine andere Art, es zu sehen
Speicherpools werden zur Laufzeit von JVM-Speichermanagern erstellt. Der Speicherpool kann entweder zum Heap- oder zum Nicht-Heap-Speicher gehören. Ein Laufzeitkonstantenpool ist eine Laufzeitdarstellung pro Klasse oder pro Schnittstelle zur Laufzeit der Tabelle const_pool in einer Klassendatei. Jeder Laufzeitkonstantenpool wird aus dem Methodenbereich der Java Virtual Machine zugewiesen, und statische Variablen werden in diesem Methodenbereich gespeichert. Auch dieser Nicht-Heap ist nichts anderes als ein Dauerwellenbereich. Tatsächlich ist der Methodenbereich Teil des Dauerwellenbereichs. ( Referenz )
quelle
Also this non-heap is nothing but perm gen area.Actually Method area is part of perm gen.
Vor Java 8:
Die statischen Variablen wurden im Permgenraum (auch Methodenbereich genannt) gespeichert.
PermGen Space wird auch als Methodenbereich bezeichnet
PermGen Space dient zum Speichern von 3 Dingen
Ab Java 8
Die statischen Variablen werden im Heap selbst gespeichert. Ab Java 8 wurde der PermGen Space entfernt und ein neuer Space mit dem Namen MetaSpace eingeführt, der im Gegensatz zum vorherigen Permgen Space nicht mehr Teil von Heap ist. Meta-Space ist im nativen Speicher vorhanden (Speicher, den das Betriebssystem einer bestimmten Anwendung für den eigenen Gebrauch zur Verfügung stellt) und speichert jetzt nur die Klassen-Metadaten.
Die internierten Zeichenfolgen und statischen Variablen werden in den Heap selbst verschoben.
Offizielle Informationen finden Sie unter: JEP 122: Entfernen Sie den permanenten Genraum
quelle
Dies ist eine Frage mit einer einfachen Antwort und einer langatmigen Antwort.
Die einfache Antwort ist der Haufen. Klassen und alle Daten, die für Klassen gelten (keine Instanzdaten), werden im Abschnitt Permanente Generierung des Heaps gespeichert.
Die lange Antwort ist bereits auf Stapelüberlauf:
Es gibt eine ausführliche Beschreibung der Speicher- und Speicherbereinigung in der JVM sowie eine Antwort, die genauer darauf eingeht .
quelle
Es wird in dem Heap gespeichert, auf den die Klassendefinition verweist. Wenn Sie darüber nachdenken, hat dies nichts mit Stack zu tun, da es keinen Gültigkeitsbereich gibt.
quelle
Zusätzlich zur Antwort von Thomas werden statische Variablen in einem Nicht-Heap-Bereich gespeichert, der als Methodenbereich bezeichnet wird.
quelle
Da statische Variablen Variablen auf Klassenebene sind, speichern sie die " permanente Generierung " des Heapspeichers. Bitte schauen Sie in diese um weitere Informationen zu der JVM. Ich hoffe, das wird hilfreich sein
quelle
statische Variablen werden im Heap gespeichert
quelle