J'essaie de comprendre ce que les concepts de jeune, vieux et générations permanentes sont dans la terminologie Java, et plus particulièrement les interactions entre les trois générations.
Mes questions sont:
Cela semble être un malentendu courant. Dans la machine virtuelle Java d'Oracle, la génération permanente ne fait pas partie du tas. C'est 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 internées étaient également stockées dans la génération permanente. Dans Java 7, les chaînes internées sont stockées dans le tas d'objet principal.
Voici un bon post sur génération permanente .
J'aime les descriptions données pour chaque espace dans le code guide sur JConsole :
Pour la machine virtuelle HotSpot Java, les pools de mémoire pour la récupération de place en série sont les suivants.
- Eden Space (heap): le pool dans lequel la mémoire est initialement allouée pour la plupart des objets.
- Espace de survivant (tas): le pool contenant des objets ayant survécu à la récupération de place de l'espace Eden.
- Tenured Generation (heap): pool contenant des objets existant depuis un certain temps dans l'espace survivant.
- Génération permanente (non tas): le pool contenant toutes les données de réflexion de la machine virtuelle elle-même, telles que des objets de classe et de méthode. Avec les machines virtuelles Java utilisant le partage de données de classe, cette génération est divisée en zones de lecture seule et en lecture-écriture.
- Cache de code (non-tas): le HotSpot Java VM comprend également un cache de code contenant la mémoire utilisée pour la compilation et le stockage du code natif.
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 à des événements de récupération de place (s'il y a toujours des références), plus il est promu. Cela 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 survivait suffisamment longtemps.
Le tas est divisé en jeunes et vieux générations comme suit:
Jeune génération : C’est un endroit où l’on a vécu pendant une courte période et divisé en deux espaces:
Ancienne génération : ce pool contient essentiellement des espaces permanents et virtuels (réservés) et contient les objets qui ont survécu après la récupération de place de Young Generation.
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 descripteur afin que l'espace PermGen soit toujours réservé aux classes et à celles qui sont liées aux classes. par exemple les membres statiques.
Mise à jour de Java8: PermGen est remplacé par Metaspace qui est très similaire.
La principale différence est que Metaspace redimensionne de manière dynamique, c’est-à-dire qu’il peut se développer au moment de l’exécution.
Espace méta-espace Java: illimité (par défaut)
Cache de code (virtuel ou réservé): si vous utilisez HotSpot Java VM, cette zone inclut la zone de cache de code celle contenant de la mémoire qui sera utilisée pour la compilation et le stockage de code natif.
Quelle est la jeune génération?
La jeune génération est l'endroit où tous les nouveaux objets sont alloués et vieillis. Lorsque la jeune génération se remplit, cela entraîne un ramassage mineur des ordures. Une jeune génération pleine d'objets morts est recueillie très rapidement. Certains objets survivants sont âgés et passent finalement à l'ancienne génération.
Quelle est l'ancienne génération?
L'ancienne génération est utilisée pour stocker de longs objets survivants. Généralement, un seuil est défini pour les objets de la nouvelle 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 collectée. Cet événement est appelé une collecte de déchets majeure
Quelle est la génération permanente?
La génération permanente contient les métadonnées requises par la machine virtuelle Java pour décrire les classes et les méthodes utilisées dans l'application. La génération permanente est renseignée par la machine virtuelle au moment de l’exécution en fonction des classes utilisées par l’application.
PermGen a été remplacé par Metaspace depuis la version de Java 8.
Les paramètres PermSize & MaxPermSize seront maintenant ignorés
Comment les trois générations interagissent-elles/interagissent-elles?
Article du didacticiel source d'image & technetwork Oracle: http://www.Oracle.com/webfolder/technetwork/tutorials/obe/Java/gc01/index.html
" Le processus général de récupération de place " décrit dans cet article les interactions entre eux avec de nombreux diagrammes.
Regardez le diagramme récapitulatif:
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 ayant survécu à un certain nombre de collections de la nouvelle génération, ainsi que de gros objets pouvant être alloués directement à l'ancienne génération. La génération permanente contient les objets que la machine virtuelle Java juge pratiques pour le ramasse-miettes, tels que les objets décrivant les classes et méthodes, ainsi que les classes et méthodes elles-mêmes.
La mémoire dans la machine virtuelle SunHotSpot 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/se rapportent-elles? Les objets (sauf les plus grands) sont d'abord attribués à la jeune génération. Si un objet reste en vie après x non. des cycles de collecte des ordures, il est promu à l’ancien/tenure gen. On peut donc dire que la jeune génération contient les objets de courte durée, tandis que la vieille génération contient les objets ayant une longue durée de vie. Le permanent gen n'interagit pas avec les deux autres générations.