web-dev-qa-db-fra.com

Java terminologie de tas: générations jeunes, anciennes et permanentes?

J'essaie de comprendre ce que les concepts de jeunevieux 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:

  • Quelle est la jeune génération?
  • Quelle est l'ancienne génération?
  • Quelle est la génération permanente?
  • Comment les trois générations interagissent-elles/interagissent-elles?
300
knorv

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.

288
Joshua McKinnon

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:

  • Eden Space : Objet créé à l'aide d'un nouveau mot clé mémoire alloué sur cet espace.
  • Espace de survivant : Il s'agit du pool contenant des objets qui ont survécu après la récupération de place par Java de l'espace Eden.

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.

  • Espace occupé: Ce pool de mémoire contient des objets qui ont survécu après plusieurs récupérations de mémoire, un objet ayant survécu après la récupération de place de l'espace Survivor.

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.

enter image description here

Courtoisie

177
Premraj

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?

enter image description here

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:

enter image description here

39
Ravindra babu

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.

15
Mark R

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.

  • Jeune génération: les objets nouvellement créés sont attribués à la jeune génération.
  • Ancienne génération: si le nouvel objet demande un plus grand espace de tas, il est alloué directement à l’ancien gén. De plus, les objets qui ont survécu à quelques cycles de GC sont promus dans l’ancienne génération, c’est-à-dire une maison d’objets de longue vie située dans l’ancienne génération.
  • Génération permanente: 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 les méthodes, ainsi que les classes et les méthodes elles-mêmes.

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.

0
KrityAg