Espace perm vs espace tas

Premièrement, quelle est la différence entre l’espace Perm et l’espace Heap (Qu’est-ce que la JVM choisit d’utiliser pour chaque espace mémoire)?

Deuxièmement, mais surtout, quel type de rapport serait recommandé pour une application Java type MVC standard?

Le tas stocke tous les objects créés par votre programme Java. Le contenu du tas est surveillé par le ramasse-miettes, ce qui libère de la mémoire du tas lorsque vous arrêtez d’utiliser un object (c’est-à-dire lorsqu’il n’y a plus de références à l’object).

Ceci est en contraste avec la stack , qui stocke des types primitifs tels que ints et chars, et qui sont généralement des variables locales et des valeurs de retour de fonction. Ce ne sont pas des ordures collectées.

L’ espace permanent fait référence à une partie spéciale du tas. Voir cette réponse SO pour une explication: Qu’est-ce que l’espace perm?

Personnellement, je ne considère pas PermGen comme une partie spéciale du tas.

Je préférerais de beaucoup penser à heap comme une zone de mémoire dédiée au stockage des instances d’object, alors que PermGen est une zone dédiée aux définitions de classes de magasin. Par conséquent, le cycle de vie d’un tas est lié à une application, tandis que le cycle de vie de PermGen est lié à une machine virtuelle Java.

L’un des meilleurs exemples de la différence de cycle de vie d’une application et de sa JVM réside dans un conteneur Java EE. Dans un serveur d’applications, les applications peuvent être déployées et non déployées sans redémarrer le serveur. Au cours du non-déploiement (ou du redéploiement), il est facile de libérer toutes les instances d’object, à savoir l’espace de tas, mais il est difficile de supprimer toutes les classes chargées par PermGen car certaines de ces classes peuvent toujours être référencées par la JVM.

L’un de ces cas est les conducteurs qui fuient . Lorsqu’une application est déployée, un pilote JDBC est chargé et enregistré avec DriverManager. Lorsque cette application n’est pas déployée, le DriverManager rest actif et contient une référence au pilote, à son chargeur de classe d’origine et à tout ce que ce chargeur de classe a chargé. En conséquence, une fuite de mémoire dans PermGen est créée, mais ce n’est pas une faute de gestion de la mémoire de l’application.

Il est vrai que les machines virtuelles Java telles que JRocket ne possèdent aucun PermGen, tout est stocké dans le tas. Seulement dans un tel contexte, vous pouvez appeler PermGen une “partie spéciale” du tas. Même dans ce cas, nous devrions toujours voir PermGen et heap différemment, car ils ont des objectives très différents et ils ont des types de memory leaks très différents.

Mise à jour : Dans Oracle JDK 8, PermGen est remplacé par “Metaspace” et il fait maintenant officiellement partie du tas. Nous n’aurons plus besoin d’accorder spécifiquement PermGen.

Vous ne pouvez PAS donner de noms à la mémoire allouée dans le tas.

Cela signifie que int x (son nom) est alloué dans la stack. Vous pouvez atteindre le pointeur par son nom, de sorte que le pointeur se trouve dans la stack. Vous ne pouvez pas atteindre l’object par son nom, car il n’a pas de nom. L’acquisition de l’object (sans nom) doit se faire par son pointeur.