allocation statique en java – stack, stack et génération permanente

J’ai lu beaucoup de choses récemment sur les systèmes d’allocation de mémoire en Java, et j’ai lu de nombreuses sources de doutes. J’ai rassemblé mes concepts et je demanderais de passer en revue tous les points et de les commenter. J’en suis venu à savoir que l’allocation de mémoire est spécifique à la JVM, alors je dois dire à l’avance que ma question est spécifique à Sun.

  1. Les classes (chargées par les chargeurs de classes) vont dans une zone spéciale sur le tas: Génération permanente
  2. Toutes les informations relatives à une classe comme le nom de la classe, les tableaux Object associés à la classe, les objects internes utilisés par JVM (tels que java / lang / Object) et les informations d’optimisation vont dans la zone de génération permanente.
  3. Toutes les variables de membre statiques sont conservées dans la zone de génération permanente.
  4. Les objects vont sur un tas différent: Jeune génération
  5. Il n’y a qu’une seule copie de chaque méthode par classe, soit la méthode statique ou non statique. Cette copie est placée dans la zone de génération permanente. Pour les méthodes non statiques, tous les parameters et les variables locales vont sur la stack – et chaque fois qu’il y a une invocation concrète de cette méthode, une nouvelle structure de stack lui est associée. Je ne suis pas sûr de savoir où sont stockées les variables locales d’une méthode statique. Sont-ils sur le tas de la génération permanente? Ou simplement leur référence est stockée dans la zone de génération permanente, et la copie réelle est quelque part ailleurs (Où?)
  6. Je ne sais pas non plus où le type de retour d’une méthode est stocké.
  7. Si les objects (dans la jeune génération) doivent utiliser un membre statique (dans la génération permanente), ils reçoivent une référence au membre statique && ils disposent d’un espace mémoire suffisant pour stocker le type de retour de la méthode, etc.

Merci de passer par là!

Tout d’abord, comme vous devez le savoir, très peu de personnes peuvent confirmer ces réponses par des connaissances de première main. Très peu de personnes ont travaillé sur des machines virtuelles Java HotSpot récentes ou les ont étudiées à la profondeur requirejse pour vraiment savoir. La plupart des gens ici (y compris moi-même) répondent en fonction de ce qu’ils ont vu écrit ailleurs ou de ce qu’ils ont déduit. Habituellement, ce qui est écrit ici, ou dans divers articles et pages Web, est basé sur d’autres sources qui peuvent ou non être définitives. Souvent, cela est simplifié, inexact ou tout simplement faux.

Si vous voulez une confirmation définitive de vos réponses, vous devez vraiment télécharger le code source OpenJDK … et faire vos propres recherches en lisant et en comprenant le code source. Poser des questions sur SO, ou le chalutage à travers des articles web aléatoires n’est pas une technique de recherche académique solide.

Ayant dit cela …

1) Les classes (chargées par les chargeurs de classes) vont dans une zone spéciale sur le tas: Permanent Generation.

AFAIK, oui. ( Mise à jour : voir ci-dessous.)

2) Toutes les informations relatives à une classe comme le nom de la classe, les tableaux d’objects associés à la classe, les objects internes utilisés par JVM (tels que java / lang / Object) et les informations d’optimisation vont dans la zone de génération permanente.

Plus ou moins oui. Je ne suis pas sûr de ce que vous entendez par certaines de ces choses. Je suppose que “les objects internes utilisés par JVM (comme java / lang / Object)” désignent des descripteurs de classe JVM-internal.

3) Toutes les variables de membre statiques sont conservées dans la zone de génération permanente.

Les variables elles-mêmes oui. Ces variables (comme toutes les variables Java) contiendront des valeurs primitives ou des références d’object. Cependant, alors que les variables de membre statiques se trouvent dans une trame allouée dans le tas de permgen, les objects / tableaux auxquels ces variables font référence peuvent être alloués dans n’importe quel segment de mémoire.

4) Les objects entrent dans un tas différent: Jeune génération

Pas nécessairement. Les objects volumineux peuvent être atsortingbués directement à la génération titulaire.

5) Il n’y a qu’une copie de chaque méthode par classe, soit la méthode statique ou non statique. Cette copie est placée dans la zone de génération permanente.

En supposant que vous faites référence au code de la méthode, alors AFAIK oui. C’est peut-être un peu plus compliqué. Par exemple, ce code peut exister sous des formes de code bytecode et / ou natif à différents moments de la vie de la JVM.

… Pour les méthodes non statiques, tous les parameters et les variables locales vont dans la stack – et chaque fois qu’il y a une invocation concrète de cette méthode, on lui associe un nouveau cadre de stack.

Oui.

… Je ne sais pas où sont stockées les variables locales d’une méthode statique. Sont-ils sur le tas de la génération permanente? Ou simplement leur référence est stockée dans la zone de génération permanente, et la copie réelle est quelque part ailleurs (Où?)

Non, ils sont stockés dans la stack, tout comme les variables locales dans des méthodes non statiques.

6) Je ne sais pas non plus où est stocké le type de retour d’une méthode.

Si vous parlez de la valeur renvoyée par un appel de méthode (non nul), il est alors retourné dans la stack ou dans un registre de machine. S’il est renvoyé sur la stack, cela prend 1 ou 2 mots, selon le type de retour.

7) Si les objects (dans la jeune génération) utilisent un membre statique (dans la génération permanente), ils reçoivent une référence au membre statique && ils disposent d’un espace mémoire suffisant pour stocker le type de retour de la méthode, etc. .

C’est inexact (ou du moins, vous ne vous exprimez pas clairement).

Si une méthode accède à une variable membre statique, elle est soit une valeur primitive, soit une référence d’ object. Cela peut être assigné à une variable ou un paramètre local (existant), assigné à un membre statique ou non statique (existant), affecté à un élément (existant) d’un tableau précédemment atsortingbué, ou simplement utilisé et rejeté.

  • En aucun cas, un nouveau stockage ne doit être alloué pour contenir une valeur de référence ou une valeur primitive.

  • Généralement, un mot de mémoire suffit pour stocker une référence à un object ou à un tableau, et une valeur primitive occupe généralement un ou deux mots, selon l’architecture matérielle.

  • En aucun cas, l’appelant ne doit allouer d’espace pour contenir un object / tableau renvoyé par une méthode. En Java, les objects et les tableaux sont toujours renvoyés à l’aide de la sémantique pass-by-value … mais la valeur renvoyée est une référence d’object ou de tableau.

METTRE À JOUR

À partir de Java 8, l’espace PermGen a été remplacé par Metaspace. Pour plus d’informations, veuillez vous reporter à ces ressources:

  • Quelle est la différence entre PermGen et Metaspace?
  • Java 8: De PermGen à Metaspace
  • À propos du ramasse-miettes G1, de la génération permanente et du méta-espace