Je suis confondu avec la génération Heap, Young, Tenured et Perm.
Quelqu'un pourrait-il expliquer?
Le Java garbage collector est appelé un générationnel garbage collector . Les objets d'une application vivent pendant des durées variables). en fonction de l'endroit où ils sont créés et de la façon dont ils sont utilisés. L'aperçu clé ici est que l'utilisation de différentes stratégies de collecte des déchets pour les objets à vie courte et longue durée permet d'optimiser le GC spécifiquement pour chaque cas.
En gros, comme les objets "survivent" à des récupérations répétées de la génération jeune , ils sont migrés vers la génération tenure . La génération permanente est un cas particulier, elle contient des objets, dont la JVM a besoin, qui ne sont pas nécessairement représentés dans votre programme, par exemple des objets qui représentent des classes et des méthodes.
Étant donné que la Young Generation contiendra généralement beaucoup de déchets, elle est optimisée pour se débarrasser d'un grand nombre d'objets inutilisés à la fois. La génération tenured car elle contient des objets à durée de vie plus longue est optimisée pour une collecte rapide des déchets sans gaspiller beaucoup de mémoire.
Grâce aux améliorations apportées à la technologie de récupération de place, les détails sont devenus assez complexes et varient en fonction de votre machine virtuelle Java et de la façon dont elle a été configurée. Vous devriez lire la documentation pour la JVM spécifique que vous utilisez si vous avez besoin de savoir exactement ce qui se passe.
Cela dit, il existe un arrangement historique simple qui est toujours utile au niveau conceptuel. Historiquement, la Young Generation serait un collecteur de copie et le Tenured Generation soit un collecteur de marque et de balayage . Un collecteur de copie ne paie essentiellement aucun coût CPU pour se débarrasser des ordures, la plupart du coût est lié à la maintenance des objets vivants, le prix de cette efficacité est une mémoire plus lourde usage. Un collecteur de marque et de balayage paie un certain coût CPU pour les objets vivants et inutilisés mais utilise la mémoire plus efficacement.
Java Heap Memory fait partie de la mémoire allouée à JVM par le système d'exploitation. Chaque fois que nous créons des objets, ils sont créés à l'intérieur tas en Java .
L'espace Java Heap est divisé en trois régions ou génération pour le ramassage des ordures appelé Young Generation, Old or tenured Generation et Permanent Generation. La génération permanente est récupérée pendant le GC complet dans la JVM du hotspot
Le Young Generation est l'endroit où tous les nouveaux objets sont alloué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.
Le Ancienne génération est utilisé pour stocker de longs objets survivants. En règle générale, un seuil est défini pour les objets de 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é un garbage collection majeur.
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 lors de l'exécution en fonction des classes utilisées par l'application.
PermGen a été remplacé par Metaspace depuis Java Version 8. PermSize & MaxPermSize les paramètres seront maintenant ignorés. Jetez un œil à cette article dzone par Pierre - Hugues Charbonneau pour comprendre Metaspace.
Source de l'image: http://www.Oracle.com/webfolder/technetwork/tutorials/obe/Java/gc01/index.html
Reportez-vous au même article pour plus de détails.
Tous les objets du tas survivent lorsqu'ils sont référencés. Quand ils ne sont plus, le garbage collector (GC) récupérera leur mémoire.
PermGen, Young et Tenured sont différentes classifications d'objets (ou d'espaces dans le tas où ils peuvent être).
PermGen: ces objets seront toujours là, ils ne sont pas récupérés. Les objets classes sont là, les chaînes internées, etc. Je ne sais pas s'il y a un GC là-bas (quand le système décharge les classes ... mais ce n'est pas normal)
Young: lorsqu'un objet est créé, il est ici.
Tenured: un objet va à cette classification/catégorie quand il survit à N passages GC (survit = GC passe mais cet objet est référencé donc il ne peut pas être récupéré).
Selon le GC utilisé et certains paramétrisations, le GC passe plus ou moins souvent.
Ensuite, le garbage collection peut avoir différentes approches pour maange les objets du tas. Cette classification des objets aide à le faire.
Voici un autre excellent article (bien que long) sur la façon de régler/dimensionner vos paramètres GC, qui peut vous aider à comprendre encore plus:
https://docs.Oracle.com/javase/8/docs/technotes/guides/vm/gctuning/
Une lecture très utile si vous rencontrez des problèmes avec le GC et avez besoin de savoir comment lire les journaux du GC, ou si vous avez besoin de comprendre comment fonctionne votre collecteur GC actuel.
Si vous souhaitez connecter la surveillance à distance d'un système en cours d'exécution pour voir l'utilisation de la mémoire en temps réel et les exécutions du GC, consultez cet outil: