Question

J'ai lu dernièrement beaucoup sur les systèmes d'allocation de mémoire en java, et il y a eu beaucoup de doutes comme je l'ai lu à partir de diverses sources. J'ai rassemblé mes concepts, et je demande à passer par tous les points et les commenter. Je suis venu à savoir que l'allocation de mémoire spécifique machine virtuelle Java, donc je dois dire à l'avance, que ma question est spécifique du Soleil.

  1. Classes (chargés par les classloaders) vont dans une zone spéciale Heap: Génération permanent
  2. Toutes les informations relatives à une classe comme le nom de la classe, les tableaux d'objets associés à la classe, les objets internes utilisés par machine virtuelle Java (comme java / lang / Object) et des informations d'optimisation va dans la zone Génération permanente.
  3. Toutes les variables membres statiques sont conservés à nouveau sur la zone de génération permanente.
  4. Les objets 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, la statique de la méthode ou non statique. Cette copie est placée dans la zone de génération permanente. Pour les méthodes non statiques, tous les paramètres et les variables locales vont sur la pile - et chaque fois qu'il ya une invocation concrète de cette méthode, nous obtenons un nouveau cadre de pile qui lui est associée. Je ne sais pas où sont les variables locales d'une méthode statique sont stockés. Sont-ils sur le tas de permanent génération? Ou tout simplement leur référence est stockée dans la zone de génération permanente, et la copie réelle est ailleurs (Où?)
  6. Je suis pas sûr d'où vient le type de retour d'une méthode sont stockés.
  7. Si les objets (dans la jeune génération) a besoin d'utiliser un élément statique (dans la génération permanente), on leur donne une référence à l'organe statique && leur donne assez d'espace mémoire pour stocker le type de retour de la méthode, etc.

Merci de passer par cela!

Était-ce utile?

La solution

Tout d'abord, comme cela devrait être clair pour vous maintenant qu'il ya très peu de gens qui peuvent confirmer ces réponses de connaissances de première main. Très peu de gens ont travaillé sur JVMs récemment HotSpot ou les études à la profondeur nécessaire pour connaître vraiment. La plupart des gens ici (moi y compris) sont basés sur des choses, répondant qu'ils ont vu écrit ailleurs, ou ce qu'ils ont déduit. En général, ce qui est écrit ici, ou dans divers articles et pages Web, est basée sur d'autres sources qui peuvent ou peuvent ne pas être définitive. Souvent, il est simplifié, mauvais ou tout simplement inexact.

Si vous voulez une confirmation définitive de vos réponses, vous avez vraiment besoin de télécharger le code source OpenJDK ... et faire vos propres recherches par la lecture et la compréhension du code source. Poser des questions sur le SO ou la pêche au chalut à travers des articles web au hasard est pas une technique de recherche universitaire du son.

Cela dit ...

  

1) Classes (chargé par les classloaders) vont dans une zone spéciale monceau. Génération permanent

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

  

2) Toutes les informations relatives à une classe comme le nom de la classe, les tableaux d'objets associés à la classe, les objets internes utilisés par machine virtuelle Java (comme java / lang / Object) et des informations d'optimisation va dans la zone Génération permanente.

Plus ou moins, oui. Je ne sais pas ce que vous entendez par certaines de ces choses. Je suppose que les « objets internes utilisés par machine virtuelle Java (comme java / lang / Object) » signifie descripteurs de classe JVM interne.

  

3) Toutes les variables membres statiques sont conservés à nouveau sur la zone Génération permanente.

Les variables elles-mêmes oui. Ces variables (comme toutes les variables Java) détiendront soit des valeurs primitives ou des références d'objet. Cependant, alors que les variables des membres de l'électricité statique se trouvent dans une trame qui est allouée dans le tas de PermGen, les objets / tableaux mentionnés par ces variables peuvent être attribués à any tas.

  

4) Les objets vont sur un tas différent: jeune génération

Pas nécessairement. Les gros objets peuvent être attribués directement dans la génération titularisé.

  

5) Il n'y a qu'une seule copie de chaque méthode par classe, le procédé statique ou non statique. Cette copie est placée dans la zone Génération permanente.

En supposant que vous faites référence au code de la méthode, alors oui AFAIK. Il peut être un peu plus compliqué que. Par exemple que le code peut exister dans bytecode et / ou formes de code natif à différents moments de la vie de la machine virtuelle Java.

  

... Pour les méthodes non statiques, tous les paramètres et les variables locales vont sur la pile - et chaque fois qu'il ya une invocation concrète de cette méthode, nous obtenons un nouveau cadre de pile qui lui est associée.

Oui.

  

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

Non

. Ils sont stockés sur la pile, comme les variables locales dans les méthodes non statiques.

  

6) Je suis pas sûr d'où vient le type de retour d'une méthode sont stockés.

Si vous voulez parler de la valeur renvoyée par un appel de méthode (non vide), il est soit retourné sur la pile ou dans un registre de la machine. Si elle est renvoyée sur la pile, cela prend 1 ou deux mots, en fonction du type de retour.

  

7) Si les objets (dans la jeune génération) Nees d'utiliser un élément statique (dans la génération permanente), on leur donne une référence à l'organe statique && ils sont assez d'espace mémoire données pour stocker le type de retour de la procédé, etc.

inexacts (ou du moins, vous n'êtes pas vous exprimez clairement).

Si une méthode accède à une variable membre statique, ce qu'il obtient est soit une valeur primitive ou un objet référence . Cela peut être affecté à une variable locale (existant) ou d'un paramètre, affecté à un (existant) élément statique ou non statique, affecté à un élément (existant) d'un tableau alloué précédemment, ou simplement utilisée et jetée.

  • En aucun cas, nouveau besoin de stockage à allouer à détenir soit une référence ou une valeur primitive.

  • Typiquement, un mot de mémoire est tout ce qui est nécessaire pour stocker un objet ou une référence réseau, et une valeur primitive occupe habituellement un ou deux mots, en fonction de l'architecture matérielle.

  • En aucun cas besoin d'espace à allouer par l'appelant à tenir un objet / tableau retourné par une méthode. En Java, les objets et les tableaux sont toujours retournés en utilisant la sémantique passe par valeur ... mais cette valeur qui est renvoyée est une référence d'objet ou d'un tableau.

UPDATE

de Java 8, l'espace PermGen a été remplacé par Metaspace. Pour plus d'informations, s'il vous plaît se référer à ces ressources:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top