Statische Methoden (tatsächlich alle Methoden) sowie statische Variablen werden im PermGenAbschnitt 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:
static int i = 1; //the value 1 is stored in the PermGen section
static Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the PermGen section, the object itself is not.
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.