2010-05-13 4 views
5

Ogni volta che una classe viene caricata, quali sono memorizzati nell'heap e quali sono memorizzati nello stack?JVM - Heap and Stack

Anche dove risiedono i thread?

risposta

4

I tipi di riferimento sono in heap.

Qualsiasi tipo primitivo di dati e riferimenti a valori su heap (parametri/variabili locali del metodo) sono in pila.

Ogni thread ha il proprio stack.

Tutti i thread nell'applicazione condividono lo stesso heap.

+0

@Nirmal: Non è niente di strano. È lo stesso comportamento in tutti i runtime sia nel runtime C/C++ che in altro. Quindi, non capisco davvero "perché" il "perché" dalla tua parte :) –

+1

"Qualsiasi tipo di dati primitivi ... sono in pila" è un po 'di confusione. L'heap memorizza le primitive se sono membri di dati di oggetti. –

+0

Sì. Lo fa .. ma poi, come hai detto, come parte di Composites. Tuttavia, nel momento in cui accediamo ai dati, viene prima copiato nello stack. Ad esempio, per un oggetto con definizione ComplexNumber {float real, float imaginary}, in un metodo doWork (ComplexNumber cn} {return cn.real * cn.real + float.imaginary * float.immaginario; } i valori real/imaginary vengono prima portati nello stack unline cn dove solo il riferimento è portato nello stack –

3

E 'davvero facile:

  • oggetti (vale a dire le istanze di classi) sono sempre sul mucchio. Non possono essere altrove
    • i campi fanno parte degli oggetti, quindi anche vivono nell'heap.
  • i parametri locali (compresi metodo/costruttore) sono sempre nello stack. Non possono essere da nessun'altra parte.

Nota che variabili locali possono solo riferimenti hold ("puntatori") o valori primitivi. Una variabile locale non può mai contenere "un oggetto".

Si noti che questa vista è ciò che è definito nella specifica JVM. Una JVM concreta può allocare oggetti in un'area non heap se lo desidera. Ad esempio: se sa che un oggetto appena creato non fugge mai dall'invocazione corrente, allora potrebbe mettere l'oggetto istanziato nell'area dello stack. Tuttavia, questa è una ottimizzazione che non è visibile allo sviluppatore.

0

Primitives: Pila

oggetti: Mucchio

Discussioni: una pila separata, mentre condividere lo stesso mucchio.

+0

non sono i primitivi memorizzati nell'heap se sono variabili di istanza? e in pila se sono variabili locali? – Mike

0

@Joachim Sauer

Se quello che dici è vero, allora perché, nel codice seguente,

class Student{ 

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

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

Allora perché non è 'name = "Anonymous"; 'una variabile locale ?? Che tipo di variabile è e dove vive?