Terminologie du tas Java: générations jeunes, anciennes et permanentes?

318

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?
knorv
la source
En supposant que vous parlez du Sun JDK / OpenJDK, consultez la page du site Web OpenJDK sur la gestion du stockage . Il y a quelques liens pour encore plus d'informations en bas.
Nicholas Riley
1
également lié à cette question "génération
sécurisée

Réponses:

304

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 :

Pour la machine virtuelle Java HotSpot, les pools de mémoire pour le garbage collection série sont les suivants.

  • Eden Space (heap): pool à partir duquel la mémoire est initialement allouée à la plupart des objets.
  • Espace survivant (tas): la piscine contenant des objets qui ont survécu à la collecte des ordures de l'espace Eden.
  • Tenured Generation (heap): le pool contenant des objets qui existent depuis un certain temps dans l'espace survivant.
  • Génération permanente (sans segment de mémoire): pool contenant toutes les données réfléchissantes de la machine virtuelle elle-même, telles que les objets de classe et de méthode. Avec les machines virtuelles Java qui utilisent le partage de données de classe, cette génération est divisée en zones en lecture seule et en lecture-écriture.
  • Cache de code (non-tas): la machine virtuelle Java HotSpot comprend également un cache de code, contenant de 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 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.

Joshua McKinnon
la source
2
Je pense qu'à partir de Java 7, les chaînes ne sont plus internées dans la génération permanente.
Tim Goodman
Vous avez raison, je suis surpris que cela ait survécu si longtemps avant une mention. Ensuite, en Java 8, la génération permanente sera remplacée par metaspace (même si je ne sais pas à quel point ce sera vraiment différent, si ce n'est d'être illimité par défaut)
Joshua McKinnon
9
Joshua - est "ancien" synonyme de "permanent" et "nouveau" est synonyme de "survivant?"
joadha
1
la perm gen n'est applicable qu'avant Java 8.
lwpro2
2
Si vous attendez toujours une réponse, oui, vous avez raison @joadha. Consultez ce lien: codeahoy.com/2017/08/06/basics-of-java-garbage-collection
recepinanc
197

Le tas est divisé en jeunes et vieilles générations comme suit:

Young Generation : C'est un endroit où a vécu pendant une courte période et divisé en deux espaces:

  • Espace Eden : lorsque l'objet est créé à l'aide de la nouvelle mémoire de mots-clés allouée sur cet espace.
  • Espace Survivant : Il s'agit de la piscine qui contient des objets qui ont survécu après la collecte des ordures java de l'espace Eden.

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.

  • Espace occupé: ce pool de mémoire contient des objets qui ont survécu après plusieurs récupérations signifie un objet qui a survécu après une collecte 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 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.

Mise à jour Java8: PermGen est remplacé par Metaspace qui est très similaire.
La principale différence est que Metaspace se redimensionne dynamiquement, c'est-à-dire qu'il peut s'étendre au moment de l'exécution.
Espace Java Metaspace: illimité (par défaut)

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.

entrez la description de l'image ici

Courtoisie

Premraj
la source
@Premraj qu'est-ce que cela signifie? Metaspace se redimensionne dynamiquement, c'est-à-dire qu'il peut s'étendre au moment de l'exécution. ? La seule différence que par défaut il n'a pas de frontière?
gstackoverflow
1
excellent..puis-je savoir où se trouvent la zone de méthode, la pile nativestack et le pool constant d'exécution dans cette image? et ce qu'ils détiennent en conséquence?
si le cache de code est utilisé pour le code de méthode native, qu'aura la pile de méthode native (chaque thread en aura un)?
49

Qu'est-ce que la jeune génération?

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.

Qu'est-ce que 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

Qu'est-ce que la génération permanente?

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

Comment les trois générations interagissent-elles les unes avec les autres?

entrez la description de l'image ici

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:

entrez la description de l'image ici

Ravindra babu
la source
excellent..puis-je savoir où se trouvent la zone de méthode, la pile nativestack et le pool constant d'exécution dans cette image? et ce qu'ils détiennent en conséquence?
reportez-vous à docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html pour plus de détails. La zone de méthode est créée au démarrage de la machine virtuelle. Bien que la zone de méthode fasse logiquement partie du tas, les implémentations simples peuvent choisir de ne pas effectuer de récupération de place ou de la compacter. Chaque pool de constantes d'exécution est alloué à partir de la zone de méthode de la machine virtuelle Java
Ravindra babu
êtes-vous sûr ... ive lu que sa partie de l'espace permgen (qui n'est pas un tas)? journaldev.com/2856/…
La documentation Oracle est plus authentique
Ravindra babu
Le seuil est-il fixé pour les objets de la jeune génération en unités de temps (par exemple ms)? ou des rondes GC?
Très objectif
16

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.

Mark R
la source
1

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.

  • Young Generation: les objets nouvellement créés sont attribués à la jeune génération.
  • Ancienne génération: si le nouvel objet demande un espace de mémoire plus grand, il est directement alloué à l'ancienne génération. Les objets qui ont survécu à quelques cycles de GC sont également promus dans l'ancienne génération, c'est-à-dire les objets à longue durée de vie dans l'ancienne génération.
  • Génération permanente: la génération permanente contient des objets que la machine virtuelle Java trouve pratique pour gérer 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.

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.

KrityAg
la source