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


J'essaie de comprendre comment les concepts de jeune, vieux - et permanente générations dans le tas Java terminologie, 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/se rapportent-elles les unes aux autres?
Author: Ravindra babu, 2010-01-25

8 answers

Cela semble être un malentendu commun. Dans la JVM 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 les versions antérieures, les chaînes internes é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'objets principal.

Voici un bon post sur 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, la mémoire pools pour la collecte des ordures en série sont les suivantes.

  • Eden Space (heap): Le pool à partir duquel la mémoire est initialement allouée pour la plupart des objets.
  • Survivor Space (tas): Le pool contenant les objets qui ont survécu la collecte des ordures de l'Eden espace.
  • Tenured Generation (heap) : Le pool contenant des objets qui ont existé pendant un certain temps dans le survivant espace.
  • Génération permanente (non-tas): Le pool contenant tous les éléments réfléchissants données de la machine virtuelle elle-même, tels que les objets de classe et de méthode. Avec Machines virtuelles Java qui utilisent le partage de données de classe, cette génération est divisée en en lecture seule et en lecture-écriture domaines.
  • Cache de code (non-tas) : La machine virtuelle Java HotSpot inclut également un cache de code, contenant de la mémoire utilisée pour compilation et stockage de natifs code.

Java utilise générationnel la collecte des ordures. Cela signifie que si vous avez un objet foo (qui est une instance d'une classe), plus il survit d'événements de garbage collection (s'il y a encore des références à celui-ci), plus il est promu. Cela commence dans la jeune génération (qui elle - même est divisée en plusieurs espaces-Eden et Survivor) et finirait par se retrouver dans la génération tenurée si elle survivait assez longtemps.

 265
Author: Joshua McKinnon, 2013-09-23 19:54:06

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

Jeune génération : C'est un lieu où vécu pendant une courte période et divisé en deux espaces:

  • Eden Space{[11] } : Lors de la création d'un objet à l'aide d'une nouvelle mémoire de mot-clé allouée sur cet espace.
  • Survivant de l'Espace : C'est 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 est essentiellement contenir tenured et virtuel espace (réservé) et tiendra les objets qui ont survécu après la collecte des ordures de la Jeune génération.

  • Espace permanent: Ce pool de mémoire contient des objets qui ont survécu après plusieurs garbage collection signifie objet qui a survécu après la collecte des ordures de l'espace Survivant.

Génération permanente: Ce pool de mémoire comme son nom l'indique contient également des métadonnées de classe permanentes et informations sur les descripteurs donc PermGen espace toujours réservé aux classes et celles qui sont liées aux classes par exemple les membres statiques.

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

Cache de code (virtuel ou réservé): Si vous utilisez une machine virtuelle Java HotSpot cela inclut la zone de cache de code qui contient de la mémoire qui sera utilisée pour la compilation et le stockage du code natif.

entrez la description de l'image ici

Avec la permission

 153
Author: Premraj, 2016-06-02 23:42:26

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

La Jeune génération est l'endroit où tous les nouveaux objets sont alloués et âgés. Lorsque la jeune génération se remplit, cela provoque une collecte des ordures mineure. Une jeune génération pleine d'objets morts est collectée très rapidement. Certains objets survivants sont âgés et finissent par passer à l'ancienne génération.

Qu'est-Ce que l'ancienne génération?

La Ancienne génération est utilisée pour stocker des objets de longue durée. En règle générale, un seuil est défini pour l'objet 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 collectée. Cet événement est appelé un ramasse-miettes majeur

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

Le génération Permanente contient les métadonnées requises par la JVM pour décrire les classes et les méthodes utilisées dans l'application. La génération permanente est remplie par la JVM à d'exécution basé sur les classes utilisées par l'application.

PermGen a été remplacé par Metaspace depuis la sortie de Java 8.

Les paramètres PermSize & MaxPermSize seront ignorés maintenant

Comment les trois générations interagissent/se rapportent-elles les unes aux autres?

entrez la description de l'image ici

Source de l'image et article du tutoriel oracle technetwork: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

"Le processus général de récupération de place " dans l'article ci-dessus explique les interactions entre eux avec de nombreux diagrammes.

Jetez un oeil au diagramme récapitulatif:

entrez la description de l'image ici

 32
Author: Ravindra babu, 2016-10-01 13:34:08

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 alloué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 des objets volumineux qui peuvent être alloués directement dans l'ancienne génération. La génération permanente contient des objets que la JVM trouve pratiques pour que le garbage collector gère, tels que objets décrivant les classes et les méthodes, ainsi que les classes et les méthodes elles-mêmes.

 14
Author: Mark R, 2010-01-24 21:57:38

Cet article est une très bonne enquête sur les ramasseurs d'ordures. Il définit les concepts de base et la terminologie de la collecte des ordures et comprend de nombreux dessins explicatifs. C'est un" must read " pour tous ceux qui s'intéressent au fonctionnement de l'allocation automatique de mémoire; sa lecture vous facilitera la lecture et la compréhension des différents documents que d'autres ont pointés.

(Ce qui manque à ce document, ce sont des informations sur la recherche postérieure à 1993 sur les garbage collectors, surtout l'ensemble des activités des systèmes multicœurs. Pourtant, vous devez apprendre à marcher avant d'apprendre à courir.)

 11
Author: Thomas Pornin, 2010-01-26 16:16:50

En supposant que vous parlez du Sun JDK/OpenJDK, voir la page sur le site Web OpenJDK surGestion du stockage . Il y a quelques liens vers encore plus d'informations en bas.

 4
Author: Nicholas Riley, 2010-01-24 21:52:59

Bien qu'il s'agisse de réglage, je ne résiste pas à recommander ce document jetez un oeil au chapitre 3 et allez en profondeur si vous le souhaitez.

 3
Author: stacker, 2010-01-24 22:20:15

La mémoire dans la JVM SunHotSpot est organisée en trois générations: la jeune génération, l'ancienne génération et la 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 espace de tas plus grand, il est alloué directement dans l'ancienne gen.De plus, les objets qui ont survécu à quelques cycles GC sont promus dans l'ancienne gen, c'est-à-dire les objets à longue durée de vie dans l'ancienne gen.
  • Génération permanente : La génération permanente contient des objets que la JVM trouve pratiques pour que le garbage collector gère, tels que des objets décrivant des classes et des méthodes, ainsi que les classes et les méthodes elles-mêmes.

FYI: La gen permanente n'est pas considérée comme faisant partie du tas Java.

Comment les trois générations interagir/se rapportent les uns aux autres? Les objets(sauf les grands) sont d'abord alloués à la jeune génération. Si un objet reste vivant après x no. de garbage collection cycles il est promu à l'ancien / tenured gen.Par conséquent, nous pouvons dire que le jeune gen contient les objets de courte durée tandis que l'ancien gen contient les objets ayant une longue durée de vie. La gen permanente n'interagit pas avec les deux autres générations.

 0
Author: KrityAg, 2015-06-29 14:58:38