web-dev-qa-db-fra.com

Quelle est la taille de la pile par défaut, peut-elle croître, comment fonctionne-t-elle avec le garbage collection?

Je comprends que chaque fil a son propre stack. Les types primitifs et les références sont conservés dans la pile et aucun objet n'est conservé dans la pile.

Mes questions sont:

  • Combien peut accumuler une pile? (comme avec les paramètres -Xms et -Xmx)
  • Peut-on limiter sa croissance?
  • La pile a-t-elle une valeur minimale et maximale par défaut?
  • Comment fonctionne le ramassage des ordures sur la pile?
66
Batty

Combien de fois une pile peut-elle croître?

Vous pouvez utiliser une option VM nommée ss pour ajuster la taille maximale de la pile. Une option VM est généralement transmise à l'aide de l'option -X {option}. Vous pouvez donc utiliser Java -Xss1M Pour définir le maximum de taille de pile à 1M.

Chaque thread a au moins une pile. Certaines Java machines virtuelles (JVM) placent la pile Java (appels de méthodes Java) et la pile native (appels de méthodes natives dans la machine virtuelle) dans une pile, et effectuent le déroulement de la pile à l'aide de l'outil Géré vers natif, appelé M2NFrame. Certaines machines virtuelles conservent deux piles séparément. Le Xss définit la taille de la pile Java dans la plupart des cas.

Pour de nombreuses machines virtuelles, elles définissent différentes valeurs par défaut pour la taille de la pile sur différentes plates-formes.

Peut-on limiter cette croissance?

Lorsqu'un appel de méthode a lieu, un nouveau cadre de pile est créé sur la pile de ce thread. La pile contiendra des variables locales, des paramètres, une adresse de retour, etc. En Java, vous ne pouvez jamais placer d'objet sur une pile, seule la référence à un objet peut être stockée sur une pile. Puisque array est également un objet en Java, les tableaux ne sont pas non plus stockés sur une pile. Ainsi, si vous réduisez la quantité de vos variables primitives locales, les paramètres en les regroupant dans des objets, vous pouvez réduire l'espace sur la pile. En fait, le fait que nous ne puissions pas mettre d'objets sur la pile Java affecte les performances à un moment donné (cache cache).

La pile a-t-elle une valeur minimale par défaut ou une valeur maximale par défaut?

Comme je l'ai dit précédemment, différentes machines virtuelles sont différentes et peuvent changer de version. Voir ici .

comment fonctionne la récupération de place sur la pile?

Le garbage collection dans Java est un sujet d'actualité. La récupération de place a pour but de collecter des objets inaccessibles dans le tas . Donc, cela nécessite une définition de "accessible". Tout ce qui se trouve sur la pile constitue une partie des références de jeu de racines dans GC. Tout ce qui est accessible depuis chaque pile de chaque thread doit être considéré comme vivant. Il existe d'autres références aux ensembles de racines, telles que les objets Thread et certains objets de classe.

Ce n'est qu'une utilisation très vague de stack sur GC. Actuellement, la plupart des machines virtuelles utilisent un GC générationnel. Cet article donne une brève introduction à propos de Java GC. Et récemment, j'ai lu un très bon article parlant du GC sur .net. Le GC sur Oracle JVM est assez similaire, donc je pense que cela pourrait également vous aider.

78
StarPinkER

Comme vous le dites, les variables locales et les références sont stockées dans la pile. Quand une méthode retourne, le pointeur de la pile est simplement déplacé là où il était avant la méthode, c'est-à-dire que toutes les données locales sont "retirées de la pile". Par conséquent, il n'y a pas de récupération de place sur la pile, cela ne se produit que dans le tas.

Pour répondre à vos questions spécifiques:

  • Voir cette question pour savoir comment augmenter la taille de la pile.
  • Vous pouvez limiter la croissance de la pile en:
    • regrouper plusieurs variables locales dans un objet: cet objet sera stocké dans le tas et seule la référence est stockée dans la pile
    • limiter le nombre d'appels de fonction imbriqués (généralement en n'utilisant pas de récursivité)
  • Pour les fenêtres, la taille de pile par défaut est 320 Ko pour 32 bits et 1024 Ko pour 64 bits, voir ce lien .
12