Cela semble être un malentendu commun. Dans l'Oracle de la JVM, la génération permanente n'est pas partie du tas. C'est un espace séparé pour les définitions de classe et de données connexes. Dans Java 6 et les versions antérieures, interné chaînes sont également stockées dans la génération permanente. Dans Java 7, interné chaînes de caractères sont stockées dans l'objet principal de tas.
Ici, c'est un bon post sur génération permanente.
J'aime les descriptions fournies pour chaque espace dans Oracle du guide sur la JConsole:
Pour le HotSpot de la machine virtuelle Java, la mémoire
les piscines pour la série de collecte des ordures
sont les suivantes.
- Eden Space (tas): La piscine à partir de laquelle la mémoire est initialement allouée
pour la plupart des objets.
- Survivor Space (tas): La piscine contenant des objets qui ont survécu
la collecte des ordures de l'Eden
de l'espace.
- Permanent de la Génération (tas): La piscine contenant des objets qui ont existé
depuis quelques temps, dans le survivant de l'espace.
- Génération permanente (non-tas): La piscine contenant tous les réfléchissantes
les données de la machine virtuelle elle-même,
comme la classe et de la méthode des objets. Avec
De machines virtuelles Java qui utilise la classe de partage de données,
cette génération est divisé en
en lecture seule et en lecture-écriture domaines.
- Cache de Code (de non-tas): Le point de connexion de la machine virtuelle Java comprend également un cache de code,
contenant de la mémoire qui est utilisée pour
la compilation et le stockage des indigènes
code.
Java utilise les générations de collecte des ordures. Cela signifie que si vous avez un objet foo (qui est une instance d'une classe), plus la quantité de déchets d'activités de collecte, il survit (si il y a encore des références à celui-ci), plus il sera promu. Il commence dans la jeune génération (qui est lui-même divisé en plusieurs espaces d'Eden et de survie) et finirait par se retrouver dans l'permanent de la génération, si elle a survécu assez longtemps.