126 votes

allocation statique en java - tas, pile et génération permanente

J'ai récemment lu beaucoup de choses sur la mémoire, les systèmes de répartition en java, et il y a eu beaucoup de doutes que j'ai lu à partir de diverses sources. J'ai rassemblé mes concepts, et j'ai besoin de vous les gens à passer par tous les points et de les commenter. Je suis venu pour savoir que l'allocation de mémoire de la JVM spécifique, donc, je dois dire à l'avance, que ma question est Sun spécifiques.

  1. Classes (chargé par les chargeurs de classes) aller 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 d'Objets asscociated avec la classe, les objets internes utilisés par la JVM (comme java/lang/Object) et l'optimisation de l'information va dans la Génération Permanente de la zone.
  3. Tous les membres statiques variables sont conservées sur le Permanent Genration zone de nouveau.
  4. Objets d'aller sur un autre segment : la Jeune génération
  5. Il n'y a qu'un seul exemplaire de chaque méthode par classe, la méthode statique ou non statique. Cette copie est mis dans la Génération Permanente de la zone. Pour les non-méthodes statiques, tous les paramètres et variables locales d'aller sur la pile et qu'il est en béton invocation de cette méthode, nous obtenons une nouvelle pile-cadre associés. Je ne suis pas sûr de l'endroit où sont les variables locales à une méthode statique sont stockées. Sont-ils sur le tas de Permanents Genration ? Ou tout simplement leur référence est stockée dans la Génération Permanente de la zone, et la copie réelle est ailleurs (Où ?)
  6. Je suis également pas sûr d'où vient le type de retour d'une méthode stockés.
  7. Si les objets (dans la jeune génération) nees d'utiliser un membre statique(dans la génération permanente), ils sont une référence pour le membre static && ils se sont donné assez d'espace mémoire pour stocker le type de retour de la méthode,etc.

Merci de passer par le biais de ce !

163voto

Stephen C Points 255558

Tout d'abord, comme cela devrait être clair pour vous maintenant, il y a très peu de gens qui peuvent confirmer la réponse à ces questions à partir des connaissances de première main. Très peu de gens ont travaillé sur les récentes Jvm HotSpot ou étudié à la profondeur nécessaire pour vraiment savoir. La plupart des gens ici (moi y compris) sont la réponse basées sur des choses qu'ils ont vu écrit ailleurs, ou ce qu'ils ont déduit. Généralement ce qui est écrit ici, ou dans les divers articles et les pages web, est basé sur d'autres sources qui peuvent ou peuvent ne pas être définitif. Il est souvent simplifiée, inexactes ou tout simplement faux.

Si vous voulez confirmation définitive de vos réponses, vous avez vraiment besoin de télécharger le OpenJDK code source ... et de faire votre propre recherche par la lecture et la compréhension du code source. Poser des questions sur soi, ou de chalutage par hasard les articles sur le web n'est pas une bonne académique de la recherche technique.

Cela dit ...

1) les Classes (chargé par les chargeurs de classes) aller dans une zone spéciale sur le tas : Génération Permanente.

Autant que je sache, oui. (Mise à jour: dans Java 8, il n'y a pas une nette permgen tas.)

2) Toutes les informations relatives à une classe comme le nom de la classe, les tableaux d'Objets asscociated avec la classe, les objets internes utilisés par la JVM (comme java/lang/Object) et l'optimisation de l'information va dans la Génération Permanente de la zone.

Plus ou moins, oui. Je ne suis pas sûr de ce que tu veux dire par certaines de ces choses. Je suppose que les "objets internes utilisés par la JVM (comme java/lang/Object)" signifie JVM-interne de la classe de descripteurs.

3) Tous les membres statiques variables sont maintenus sur la Génération Permanente de la zone de nouveau.

Les variables d'eux-mêmes, oui. Ces variables (comme tous les Java variables) tiendra des valeurs primitives ou des références d'objet. Toutefois, si le membre statique des variables sont dans un cadre qui leur est alloué dans le permgen tas, les objets/les tableaux visés par ces variables peuvent être répartis dans tout le tas.

4) les Objets d'aller sur un autre segment : la Jeune génération

Pas nécessairement. De gros objets peuvent être attribués directement dans le pensionnaire de génération.

5) Il existe une seule copie de chaque méthode par classe, la méthode statique ou non statique. Cette copie est mis dans la Génération Permanente de la zone.

En supposant que vous faites référence au code de la méthode, alors autant que je sache, oui. Il peut être un peu plus compliqué. Par exemple, ce code ne peut exister dans le bytecode et/ou du code natif formes et à différents moments au cours de la JVM de la vie.

... Pour les non-méthodes statiques, tous les paramètres et variables locales d'aller sur la pile et qu'il est en béton invocation de cette méthode, nous obtenons une nouvelle pile-cadre associés.

Oui.

... Je ne suis pas sûr de l'endroit où sont les variables locales à une méthode statique sont stockées. Sont-ils sur le tas de Permanents Genration ? Ou tout simplement leur référence est stockée dans la Génération Permanente de la zone, et la copie réelle est ailleurs (Où ?)

Pas de. Ils sont stockés sur la pile, tout comme les variables locales non des méthodes statiques.

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

Si vous voulez dire que la valeur retournée par une (non-nulle) appel de la méthode, puis il est retourné sur la pile ou dans une machine à enregistrer. Si elle est retournée sur la pile, cela prend 1 ou deux mots, selon le type de retour.

7) Si les objets (dans la jeune génération) nees d'utiliser un membre statique(dans la génération permanente), ils sont une référence pour le membre static && ils se sont donné assez d'espace mémoire pour stocker le type de retour de la méthode,etc.

Qui est inexact (ou au moins, vous n'êtes pas à vous exprimer clairement).

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

  • En aucun cas, la nouvelle de stockage doivent être allouées pour tenir une référence ou une valeur primitive.

  • En règle générale, un mot de la mémoire est tout ce qui est nécessaire pour stocker un objet ou un tableau de référence, et une valeur primitive occupe en général un ou deux mots, en fonction de l'architecture matérielle.

  • En aucun cas besoin d'espace pour être affecté par l'appelant à tenir un objet / tableau retourné par une méthode. En Java, les objets et les tableaux sont toujours renvoyés à l'aide passe par la valeur sémantique ... mais que la valeur retournée est un objet ou un tableau de référence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X