J'essaie de comprendre quels sont les concepts des générations jeunes , anciennes et permanentes dans la terminologie du tas Java, et plus précisément les interactions entre les trois générations.
Mes questions sont:
- Qu'est-ce que la jeune génération?
- Qu'est-ce que l'ancienne génération?
- Qu'est-ce que la génération permanente?
- Comment les trois générations interagissent-elles les unes avec les autres?
Réponses:
Cela semble être un malentendu courant. Dans la machine virtuelle Java d'Oracle, la génération permanente ne fait pas partie du tas. Il s'agit d'un espace séparé pour les définitions de classe et les données associées. Dans Java 6 et versions antérieures, les chaînes internes étaient également stockées dans la génération permanente. Dans Java 7, les chaînes internes sont stockées dans le tas d'objets principal.
Voici un bon article sur la génération permanente .
J'aime les descriptions données pour chaque espace dans le guide d'Oracle sur JConsole :
Java utilise la récupération de place générationnelle. Cela signifie que si vous avez un objet foo (qui est une instance d'une classe), plus il survit d'événements de récupération de place (s'il y a encore des références), plus il est promu. Il commence dans la jeune génération (qui est elle-même divisée en plusieurs espaces - Eden et Survivor) et finirait par se retrouver dans la génération permanente si elle survit assez longtemps.
la source
Young Generation : C'est un endroit où a vécu pendant une courte période et divisé en deux espaces:
Ancienne génération : ce pool contient essentiellement un espace permanent et virtuel (réservé) et contiendra les objets qui ont survécu après la collecte des ordures de la jeune génération.
Génération permanente: Ce pool de mémoire, comme son nom l'indique, contient également des métadonnées de classe permanentes et des informations de descripteurs, de sorte que l'espace PermGen est toujours réservé aux classes et à celles qui sont liées aux classes, par exemple les membres statiques.
Cache de code (virtuel ou réservé): Si vous utilisez HotSpot Java VM, cela inclut une zone de cache de code contenant de la mémoire qui sera utilisée pour la compilation et le stockage de code natif.
Courtoisie
la source
La jeune génération est l'endroit où tous les nouveaux objets sont attribués et vieillis. Lorsque la jeune génération se remplit, cela entraîne une petite collecte des ordures. Une jeune génération pleine d'objets morts est recueillie très rapidement. Certains objets survivants sont vieillis et finissent par passer à l'ancienne génération.
L' ancienne génération est utilisée pour stocker de longs objets survivants. En règle générale, un seuil est défini pour les objets de la jeune génération et lorsque cet âge est atteint, l'objet est déplacé vers l'ancienne génération. Finalement, l'ancienne génération doit être récupérée. Cet événement est appelé une importante collecte de déchets
La génération permanente contient les métadonnées requises par la JVM pour décrire les classes et méthodes utilisées dans l'application. La génération permanente est remplie par la JVM au moment de l'exécution en fonction des classes utilisées par l'application.
PermGen a été remplacé par Metaspace depuis la sortie de Java 8.
Les paramètres PermSize et MaxPermSize seront désormais ignorés
Article du didacticiel sur la source d'image et Oracle Technetwork: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
" Le processus général de collecte des ordures " dans l'article ci-dessus explique les interactions entre eux avec de nombreux diagrammes.
Jetez un œil au schéma récapitulatif:
la source
La machine virtuelle Java est organisée en trois générations: une jeune génération, une ancienne génération et une génération permanente. La plupart des objets sont initialement attribués à la jeune génération. L'ancienne génération contient des objets qui ont survécu à un certain nombre de collections de la jeune génération, ainsi que de gros objets qui peuvent être attribués directement à l'ancienne génération. La génération permanente contient des objets que la JVM trouve commode à gérer par le garbage collector, tels que des objets décrivant les classes et les méthodes, ainsi que les classes et les méthodes elles-mêmes.
la source
La mémoire dans SunHotSpot JVM est organisée en trois générations: jeune génération, ancienne génération et génération permanente.
FYI: La génération permanente n'est pas considérée comme faisant partie du tas Java.
Comment les trois générations interagissent-elles les unes avec les autres? Les objets (sauf les grands) sont d'abord attribués à la jeune génération. Si un objet reste vivant après x non. des cycles de collecte des ordures, il est promu à la génération ancienne / titulaire. On peut donc dire que la jeune génération contient les objets à vie courte tandis que l'ancienne génération contient les objets à longue durée de vie. Le gène permanent n'interagit pas avec les deux autres générations.
la source