6
votes

JVM - tas et pile

Chaque fois qu'une classe est chargée, ce qui sont stockés dans le tas et ce qui sont stockés dans la pile?

aussi où réside les threads?


0 commentaires

3 Réponses :


4
votes

Les types de référence sont en tas.

Toute données de type primitif et références à des valeurs sur le tas (paramètres / variables locales de la méthode) sont sur la pile.

Chaque fil a sa propre pile.

Tous les threads de l'application partagent le même tas.


3 commentaires

@Nirmal: Ce n'est rien d'étrange. C'est le même comportement à travers tous les roulements, ce qui est-il C / C ++ Runtime ou autrement. Donc, je ne comprends pas vraiment "pourquoi" le "pourquoi" de votre côté :)


"Toutes les données de type primitif ... sont sur le tas" est un peu déroutant. Le tas stocke les primitifs s'ils sont des membres de données d'objets.


Oui. Cela fait .. Mais alors, comme vous l'avez mentionné, dans le cadre de composites. Cependant, au moment où nous accédons aux données, il est d'abord copié sur la pile. Par exemple, pour un objet avec la définition complexnumber {flotteur réel, float imaginaire}, dans une méthode dowork (complexnumber cn} {retour cn.real * cn.real + float.imaginy * float.imaginary;} Les valeurs réelles / imaginaires sont d'abord apporté sur la pile disclet du CN où seule la référence est apportée sur la pile



4
votes

C'est vraiment facile:

  • Objets (c'est-à-dire des instances de classes) sont toujours sur le tas. Ils ne peuvent être nulle part ailleurs
    • Les champs font partie des objets, ils vivent donc aussi sur le tas.
    • Les variables locales (y compris la méthode / constructeur) Les paramètres sont toujours sur la pile. Ils ne peuvent être nulle part ailleurs.

      Notez que les variables locales peuvent uniquement références de maintien ("pointeurs") ou des valeurs primitives. Une variable locale ne peut jamais tenir "un objet".

      Notez que cette vue est ce qui est défini dans la spécification JVM. Un JVM concret pourrait allouer des objets dans une zone non-tasse si elle le souhaite. Par exemple: si elle sait qu'un objet nouvellement créé n'échappe jamais à l'invocation actuelle, alors il pourrait mettre l'objet instancié dans la zone de pile. Cependant, c'est une optimisation très visible pour le développeur.


0 commentaires

-1
votes

Primitives: pile

Objets: tas

threads: avoir une pile séparée tout en partageant le même tas.


1 commentaires

Les primitives ne sont-elles pas stockées sur le tas s'ils sont des variables d'instance? et sur la pile si ce sont des variables locales?