2010-05-13 3 views
5

Chaque fois qu'une classe est chargée, que contient-elle dans le tas et que stocke-t-on dans la pile?JVM - Tas et pile

Où résident également les threads?

Répondre

4

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

Toutes les données de type primitif et les références aux valeurs sur tas (paramètres/variables locales de la méthode) sont sur la pile.

Chaque thread a sa propre pile.

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

+0

@Nirmal: Ce n'est rien d'étrange. C'est le même comportement dans toutes les exécutions que ce soit en exécution C/C++ ou autre. Donc, je ne comprends pas vraiment "pourquoi" le "pourquoi" de votre côté :) –

+1

"Toutes les données de type primitif ... sont sur le tas" est un peu déroutant. Le tas stocke des primitives si elles sont des membres de données d'objets. –

+0

Oui. C'est le cas ... mais ensuite, comme vous l'avez mentionné, dans le cadre de Composites. Cependant, au moment où nous accédons aux données, elles sont d'abord copiées dans la pile. Par exemple, pour un objet avec définition ComplexNumber {float réel, float imaginaire}, dans une méthode doWork (ComplexNumber cn} {return cn.real * cn.real + float.imaginary * float.imaginaire; } les valeurs real/imaginary sont d'abord amenées sur la pile unline cn où seule la référence est portée sur la pile –

3

Il est vraiment facile:

    objets
  • (à savoir des instances de classes) sont toujours sur le tas. Ils ne peuvent pas être ailleurs
    • Les champs font partie d'objets, donc ils vivent également sur le tas.
  • Les variables locales (y compris méthode/constructeur) sont toujours sur la pile. Ils ne peuvent pas être ailleurs.

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

Notez que cette vue est ce qui est défini dans la spécification JVM. Une JVM concrète peut allouer des objets dans une zone sans tas, si elle le souhaite. Par exemple: s'il sait qu'un objet nouvellement créé n'échappe jamais à l'appel en cours, alors pourrait placer l'objet instancié dans la zone de pile. Cependant, c'est une optimisation qui n'est pas visible pour le développeur.

0

Primitives: Empilez

Objets: Heap

Threads: Avoir une pile séparée en partager le même tas.

+0

ne sont pas des primitives sont stockées sur le tas si ce sont des variables d'instance? et sur la pile si ce sont des variables locales? – Mike

0

@Joachim Sauer

Si ce que vous dites est vrai, alors pourquoi, dans le code suivant,

class Student{ 

    int age;    //instance variable 
    String name;  //instance variable 

     public Student() 
    { 
    this.age = 0; //local variable and member of an object 
    name = "Anonymous"; 
    } 

Alors pourquoi ne pas « name = "Anonymous"; 'une variable locale ?? De quel type de variable s'agit-il et où vit-elle?

Questions connexes