Ne Java primitives aller sur la Pile ou le Tas?
Je sais juste que la non-primitives (les objets) aller sur le tas, et les méthodes d'aller sur la pile, mais quid de la primitive variables?
--mise à jour
Sur la base des réponses, je pourrais dire que le tas peut avoir une nouvelle pile et le tas pour un objet donné? Étant donné que l'objet primitif et les variables de référence..?
- Chaque thread possède sa propre pile, pas de chaque objet. Si il y a un seul fil, puis theres une seule pile.
Vous devez vous connecter pour publier un commentaire.
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.
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 deHeapClass
. Chaque fois qu'une instance de HeapClass est alloué (par exemplenew Test.HeapClass()
), toutes les variables de membre de la HeapClass sont ajouté au tas. Ainsi, depuis les instances deHeapClass
sont alloués sur le tas,int y
serait sur le tas dans le cadre d'une instance deHeapClass
.Cependant, toutes les primitives des variables déclarées dans le corps de n'importe quelle méthode serait sur la pile.
Comme vous pouvez le voir dans l'exemple ci-dessus,
int x
est sur la pile parce qu'il est déclaré dans un corps de méthode, non pas comme un membre d'une classe.int y
était un membre statique 😛Toutes les variables locales (y compris les arguments de méthode) aller sur la pile; les objets et tous leurs champs sont stockés dans le tas. Les Variables sont toujours primitives ou références à des objets.
Implémentations Java peut effectivement stocker des objets sur le tas de telle manière qu'elle reste conforme à la spécification. De même, les variables locales peuvent être stockées dans les registres ou deviennent indistinctes par le biais de l'optimisation.
primitives peuvent être trouvés dans les deux endroits.
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.
Des valeurs primitives sont allouées sur la pile, à moins qu'ils sont les champs d'un objet, dans ce cas, ils vont sur le tas. La pile est utilisée pour l'évaluation et l'exécution, donc pas qu'il n'a pas de sens de dire que les objets primitif, les champs ont une pile, il est encore considéré comme faisant partie du tas. Même
Stack
les objets sont alloués sur le tas.