Persönlich würde ich PermGen nicht als besonderen Teil des Haufens betrachten.
Ich würde Heap lieber als Speicherbereich zum Speichern von Objektinstanzen betrachten, während PermGen als Bereich zum Speichern von Klassendefinitionen dient. Infolgedessen ist der Lebenszyklus eines Heaps an eine Anwendung gebunden, während der Lebenszyklus von PermGen an eine JVM gebunden ist.
Eines der besten Beispiele dafür, warum eine Anwendung und ihre JVM einen unterschiedlichen Lebenszyklus haben können, befindet sich in einem Java EE-Container. In einem App-Server können Anwendungen bereitgestellt und nicht bereitgestellt werden, ohne den Server neu zu starten. Während der Aufhebung der Bereitstellung (oder erneuten Bereitstellung) ist es einfach, alle Objektinstanzen, dh den Heap-Speicherplatz, freizugeben. Es ist jedoch ziemlich schwierig, alle von dieser App geladenen Klassen aus PermGen zu löschen, da einige der Klassen weiterhin von der JVM referenziert werden können.
Einer dieser Fälle sind die undichten Treiber . Wenn eine App bereitgestellt wird, wird ein JDBC-Treiber geladen und im DriverManager registriert. Wenn diese App nicht bereitgestellt wird, lebt der DriverManager weiter und enthält einen Verweis auf den Treiber, seinen ursprünglichen Klassenlader und alles, was dieser Klassenlader geladen hat. Infolgedessen wird ein Speicherverlust in PermGen erstellt, der jedoch nicht an der Speicherverwaltung der Anwendung liegt.
Es ist wahr, dass JVMs wie JRocket überhaupt kein PermGen haben, alles ist auf einem Haufen gespeichert. Nur in einem solchen Kontext können Sie PermGen als "besonderen Teil" des Heaps bezeichnen. Selbst dann sollten wir PermGen und Heap immer noch unterschiedlich betrachten, da sie einen sehr unterschiedlichen Zweck haben und sehr unterschiedliche Arten von Speicherlecks aufweisen.
Update : In Oracle JDK 8 wird PermGen durch "Metaspace" ersetzt und ist nun offiziell Teil des Heaps. Wir müssen PermGen nicht mehr speziell einstellen.