Personnellement, je ne considère pas la PermGen une partie spéciale de la tas.
Je préfèrerais faire penser à des tas comme une zone de mémoire dédié pour stocker des instances de l'objet tandis que la PermGen comme un espace dédié pour stocker les définitions de classe. En conséquence, un tas de cycle de vie est liée à une application lors de la PermGen du cycle de vie est liée à une JVM.
L'un des meilleurs exemples d'une application et sa JVM peut avoir différentes du cycle de vie est dans un conteneur Java EE. Dans un serveur d'application, les applications peuvent être déployées et non déployée sans redémarrer le serveur. Au cours de la undeployment (ou de réinsertion), il est facile de libérer toutes les instances de l'objet c'est à dire de la mémoire, mais c'est plutôt difficile à effacer toutes les classes chargées par cette app de PermGen parce que certaines classes peuvent encore être référencé par la JVM.
L'un de ces cas est la Fuite des Pilotes. Lorsqu'une application est déployée, un pilote JDBC est chargé et enregistré avec le DriverManager. Lorsque cette application est déployé, le DriverManager vies et tient une référence pour le conducteur, sa classe d'origine chargeur, et tout ce chargeur de classe chargé. En conséquence, une fuite de mémoire dans PermGen est créé, mais c'est pas la faute de l'application de gestion de la mémoire.
Il est vrai que les machines virtuelles comme JRocket n'ont pas PermGen à tous, tout est stocké en tas. C'est seulement dans ce contexte, pouvez-vous appeler PermGen une "partie spéciale" des tas. Même alors, nous devrions encore vue PermGen et tas différemment, car ils ont très différents et ils ont de très différents types de fuites de mémoire.
Mise à jour: Dans Oracle JDK 8, PermGen est remplacé par "Metaspace" et c'est maintenant officiellement partie du tas. Nous n'avons pas besoin d'ajuster précisément PermGen.