Question

La mémoire de tas est détruite en Java.

est la poubelle de la pile recueillie ainsi?

Comment est la mémoire pile récupérée?

Pas de solution correcte

Autres conseils

La mémoire dans la pile contient procédé de paramètres et de variables locales (pour être précis: les références des objets et se variables pour les types primitifs). Ce sera supprimée automatiquement si vous quittez la méthode. Si les variables sont des références à des objets () les objets se trouvent sur le tas et manipulés par le garbage collector.

Ainsi, la pile ne sont pas des déchets collectés de la même manière que le tas, mais la pile est une forme de gestion de mémoire automatique dans sa propre (qui est antérieure à la collecte des ordures).

réponse plus détaillée est donnée par Thomas Pornin , regardez dans ce pour plus de détails.

La pile ne ramasse-miettes en Java.

La pile alloué pour un appel de méthode donnée est libéré lorsque le retour de la méthode. Puisque c'est une structure LIFO très simple, il n'y a pas besoin pour la collecte des ordures.

Un endroit où la Interagir de la pile et la collecte des ordures est que les références sur la pile sont des racines GC (ce qui signifie qu'ils sont les références de racine à partir de laquelle est décidé joignabilité).

La pile peut soient nettoyés. Cependant, dans la plupart des implémentations de la JVM, il est traité comme, eh bien, une « pile », qui, par définition, exclut la collecte des ordures.

Ce que nous appelons la pile est l'accumulation de contextes d'activation de la méthode : pour chaque méthode invoquée, c'est la structure conceptuelle qui contient les arguments de la méthode, les variables locales, un pointeur caché dans le contexte de la méthode d'appel, et une fente pour enregistrer le pointeur d'instruction. Le contexte d'activation n'est pas accessible en tant que telle de la langue Java lui-même. Un contexte devient inutile lorsque la méthode sort (avec un return ou à cause d'une exception levée). Il se trouve que lorsqu'une méthode A appelle une méthode B, il est garanti que lorsque A reprend le contrôle, le contexte B est devenu inutile. Cela implique que la durée de vie du contexte B est une sous-gamme de la durée de vie du contexte pour A. Par conséquent, les contextes d'activation (pour un fil donné) peuvent être attribués avec un LIFO ( « Last In, First Out ») discipline. En mots plus simples, une pile:. Un nouveau contexte d'activation est poussé au-dessus de la pile de contextes, et le contexte sur le dessus seront les premiers à être éliminés

Dans la pratique, les contextes d'activation (aussi appelés cadres de pile ) sont concaténés, dans l'ordre de la pile, dans un espace dédié. Cette zone est obtenue à partir du système d'exploitation lorsque le fil est démarré, et le système d'exploitation, il revient quand le fil se termine. Le sommet de la pile est désigné par un pointeur spécifique, souvent contenu dans un registre CPU (cela dépend si la machine virtuelle Java interprète ou la compilation du code). Le « pointeur sur le contexte de l'appelant » est virtuel; Le contexte de l'appelant est nécessairement situé juste au-dessous dans l'ordre de la pile. Le GC ne pas intervenir: la zone de la pile est créé et récupéré de manière synchrone, de l'activité de fil lui-même. C'est aussi comment cela fonctionne dans de nombreuses langues telles que C , qui n'ont pas un GC du tout.

Maintenant rien n'empêche une implémentation JVM de faire autrement, par exemple l'allocation des contextes d'activation dans le tas et les avoir recueillis par le GC. Cela ne fait habituellement dans des machines virtuelles Java depuis l'allocation de la pile est plus rapide. Mais d'autres langues doivent faire de telles choses, notamment ceux qui jouent avec les continuations tout en utilisant un GC (par exemple Scheme et son call-with-current-continuation fonction ), parce que ces jeux briser la règle LIFO expliqué ci-dessus.

La partie de la pile de la mémoire fonctionne comme une « pile ». Je sais que cela sonne mal, mais c'est exactement comment cela fonctionne. Les données sont ajoutées au sommet, au-dessus de l'autre (pushed onto the stack) et est automatiquement retiré de la partie supérieure (popped off the stack) que votre programme fonctionne. Il ne ramasse-miettes - et il n'a pas besoin d'être depuis que la mémoire est automatiquement récupéré une fois les données extraites de la pile. Et quand je dis RECLAIMED Je ne veux pas se désallouée -. Il est juste que l'emplacement dans la mémoire de la pile où les prochaines données seront stockées est diminuée, car les données sont hors sauté

Bien sûr, cela ne veut pas dire que vous ne devez pas vous inquiéter du tout autour de la pile. Si vous exécutez une fonction récursive plusieurs fois, il finira par utiliser tout l'espace de la pile. Le même si vous appelez de nombreuses fonctions, en particulier si elles ont beaucoup de paramètres et / ou variables locales.

Mais l'essentiel est que la mémoire de la pile est utilisé et récupéré en tant que fonctions entrer et sortir de la portée - automatiquement. Ainsi, à la fin de l'exécution de votre programme toute la mémoire de la pile serait libre puis relâché au système d'exploitation.

Si vous faites référence à la mémoire utilisée sur la pile, il ne ramasse-miettes.
La machine virtuelle Java utilise des instructions de bytecode explicites pour réserver et libérer de la mémoire sur la pile, ces instructions sont générées par le compilateur et gérer la durée de vie primitives comme int, boolean, références objet doubles et sur la pile.
Il y a eu des plans pour mettre en œuvre que l'on appelle l'optimisation des appels de queue, qui supprimerait certains éléments de la pile une fois qu'il sait qu'ils ne sont plus utilisés, mais je ne sais pas jvm qui soutient déjà.
Donc, non il n'y a pas de collecte des ordures pour la pile elle-même, seuls les poussoirs générés par le compilateur et les instructions pop pour gérer l'utilisation de la mémoire.

La pile elle-même fait partie d'un fil. La pile est allouée lorsque l'objet de fil est créé et déchets collectés après que le fil fin et l'objet thread n'est plus référencé.

Tous les objets Java sont attribués sur le tas. (Au moins aussi loin que la spécification va, la mise en œuvre effective peut les affecter sur la pile si elles se comportent de manière transparente comme si elles étaient sur le tas.)

Exactement ce qui est de collection est un peu subtile. Si la seule référence à un objet est en une seule image de la pile, et il peut être démontré que la référence ne sera pas utilisée à nouveau, l'objet peut être recueilli. Si l'objet est uniquement utilisé pour lire un champ, alors que lecture de champ peut être optimisé en avant et l'objet recueilli plus tôt que vous pourriez attendre.

Peu importe habituellement à moins que vous utilisez finaliseurs (ou probablement References). Dans ce cas, vous devez être prudent et utiliser des verrous / volatile pour appliquer une relation happens-before.

Lorsque les threads d'arrêt, alors typiquement sera désallouée l'ensemble de la pile.

Tout situé sur la pile est traitée comme racines mondiales par un éboueur. Alors, oui, vous pouvez certainement dire que la pile est « ramasse-miettes ».

Personne, les données sont poussées et de la pile comme sauté vous avez des variables internes dans les méthodes, au cours des appels de méthode, etc. Vous n'avez pas besoin de se soucier de cela.

Non. La pile est pas de déchets collectés en Java. Chaque thread a sa propre pile et contient:

  1. Méthode valeurs spécifiques (qui sont de courte durée) et
  2. Les références aux objets créés sur tas, et sont renvoyés par la méthode

Ces valeurs sont poussés comme des cadres de pile à la pile pour chaque appel de méthode. Étant donné que la pile suit pour « Last-premier sorti », à la fin de chaque appel de méthode, chaque cadre de pile contenant toutes les méthodes données spécifiques et les références à des objets, le cas échéant, est émergea.

Par conséquent, les données dans la pile sont nettoyés automatiquement une fois que le procédé / programme est hors de portée.

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