2012-05-17 1 views
4

Cela peut sembler stupide mais je ne suis pas encore clair sur la pile Java et le tas de mémoire. Ce que je sais de l'étude est la suivante:Confondu avec la gestion de la mémoire Java (piles et tas)

1) Tous les appels de méthode vont sur la pile.

2) Toute la mémoire allouée passe localement sur segment de mémoire (pas très clair sur ce point)

3) Toute la mémoire allouée par nouvel opérateur (soit dans un procédé ou dans une classe) va de segment de mémoire .

Je suis inquiet au sujet des cas ci-dessous:

1) Si je crée une variable int dans une méthode et le retourner, où vont (je crois qu'il va sur la pile, mais besoin d'éclaircissements). 2) Si je crée un nouvel objet dans une méthode, il continue sur la mémoire de tas telle qu'elle existe même après l'exécution des méthodes (je comprends cela parce que le code de hachage de l'objet créé par java reste identique quand j'attribue cet objet à une variable de référence externe ou je retourne cet objet).

3) Mon problème est ce qui se passe si je n'attribue pas l'objet mentionné au point 2 à une référence ou si je ne le renvoie pas. Est-il encore créé sur tas? Logiquement, ça devrait l'être, mais s'il vous plaît, éclairez-moi.

Répondre

8

Tous les paramètres de méthode vont sur la pile. Toutes les variables locales vont sur la pile. La seule chose qui va dans le tas est une chose allouée en utilisant explicitement new (ou implicitement par la boxe automatique ou varargs.)

Une autre façon de penser est que les valeurs primitives et objet/tableau références peuvent aller sur le empiler, mais les objets réels ne peuvent pas .

Alors:

1) - vous retournez une valeur primitive (pas une variable), et il va sur la pile!. (Vous ne pouvez pas "renvoyer" une variable La variable fait partie du cadre de la pile et ne peut pas être détachée de celle-ci.)

2) Oui. 3) Oui, au moins pour l'instant . À un moment donné, le GC peut s'exécuter, remarquer que l'application n'a plus de référence sur l'objet et le récupérer.


1 - en fait, les derniers compilateurs hotspots sont capables de détecter que la référence d'un objet jamais « échappe » de la méthode qui crée, et que les objets pourraient être alloués sur la pile. IIRC, cette optimisation - appelée analyse d'échappement - doit être activée à l'aide d'un indicateur de ligne de commande JVM.

+0

Merci much..I suis satisfait de la réponse :) – dharam

1

Segment de code: Les valeurs constantes sont souvent placées directement dans le segment de code de programme.

Pile: Les références d'objet et les variables primitives sont placées sur la pile. Heap: Chaque fois que vous créez un objet, le stockage est alloué sur le tas lorsque ce code est exécuté.

Pour vos questions:

1) Oui

2) Oui

3) Oui