60 votes

Les primitives Java vont-elles sur la pile ou le tas?

Je sais juste que les non-primitives (les objets) vont sur le tas, et que les méthodes vont sur la pile, mais qu'en est-il des variables primitives?

--mise à jour

Sur la base des réponses, je pourrais dire que le tas peut avoir une nouvelle pile et un nouveau tas pour un objet donné? Étant donné que l'objet aura des variables primitives et de référence ..?

101voto

Jack Edmonds Points 10264

Primitives définies localement serait sur la pile. Toutefois, si une primitive ont été définis dans le cadre d'une instance d'un objet, que primitive serait sur le tas.

public class Test
{
    private static class HeapClass
    {
        public int y; // When an instance of HeapClass is allocated, this will be on the heap.
    }
    public static void main(String[] args)
    {
        int x=1; // This is on the stack.
    }
}

En ce qui concerne la mise à jour:

Les objets n'ont pas leur propre pile. Dans mon exemple, int y serait en fait une partie de chaque instance de HeapClass. Chaque fois qu'une instance de HeapClass est alloué (par exemple, new HeapClass()), toutes les variables de membre de la HeapClass sont ajouté au tas. Ainsi, depuis les instances de l' HeapClass sont alloués sur le tas, int y serait sur le tas dans le cadre d'une instance d' HeapClass.

Cependant, toutes les primitives des variables déclarées dans le corps de la méthode, serait sur la pile.

Comme vous pouvez le voir dans l'exemple ci-dessus, int x sur la pile car il est déclaré dans un corps de méthode, non pas comme un membre d'une classe.

19voto

Toutes les variables locales (y compris les arguments de méthodes) vont dans la pile; les objets et tous leurs champs sont stockés dans le tas. Les variables sont toujours des primitives ou des références à des objets.

Les implémentations Java peuvent en fait stocker des objets sur le tas de telle sorte que celui-ci soit toujours conforme à la spécification. De même, les variables locales peuvent être stockées dans des registres ou devenir indistinctes par optimisation.

11voto

Logan Capaldo Points 22145

primitives peuvent être trouvés dans les deux endroits.

class Foo
{
   public int x;
   public static void Main()
   {
      int y = 3; // y is on the stack
      Foo f = new Foo();  // f.x is probably on the heap
   } 
}

sauf que vous ne devriez pas vraiment, sauf si vous êtes la construction d'une JVM. Un très intelligent optimiseur peut décider que, depuis le Foo, f les points à ne sort jamais de la Main, et n'est jamais passé à une autre fonction qu'il est sûr d'allouer sur la pile.

En ce qui concerne la mise à jour:

La pile et le tas ne sont pas distingués par ce qui est stockée en eux, mais plutôt les activités prévues pour eux. La pile permet d'allouer un morceau de la mémoire dans un dernier entré, premier sorti de la mode, vous ne pouvez pas libérer un morceau jusqu'à ce que tous les morceaux les plus jeunes qu'il a également été libéré. Cet hôtel s'harmonise avec comment une pile d'appel est utilisé. Vous pouvez mettre n'importe quoi sur la pile tant qu'il est ok pour que la chose à aller loin quand votre fonction retourne. C'est de l'optimisation, car il est très rapide d'allouer et de libérer à partir d'une pile puisqu'il prend en charge uniquement être utilisé de cette manière. On pourrait stocker toutes les variables locales d'une fonction sur le tas dans une mise en œuvre si l'on voulait. Le tas est plus flexible et donc plus coûteux à utiliser. Il ne serait pas exact de dire qu'un objet a une pile et un tas, comme je l'ai dit, ce qui distingue la pile dans le tas n'est pas ce qu'il est, mais les opérations disponibles.

9voto

Mark Cidade Points 53945

Les valeurs primitives sont allouées sur la pile sauf s'il s'agit des champs d'un objet, auquel cas elles sont placées dans le tas. La pile est utilisée pour l'évaluation et l'exécution, il est donc inutile de dire que les objets avec des champs primitifs ont une pile, elle est toujours considérée comme faisant partie du tas. Même les objets Stack sont alloués sur le tas.

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