2010-05-13 12 views
5

Cuando se carga una clase, ¿qué se almacena en el montón y qué se almacena en la pila?JVM - Heap and Stack

¿Dónde residen los hilos?

Respuesta

4

Los tipos de referencia están en el montón.

Cualquier tipo de datos primitivos y las referencias a los valores en el montón (parámetros/variables locales del método) están en la pila.

Cada hilo tiene su propia pila.

Todos los hilos en la aplicación comparten el mismo montón.

+0

@Nirmal: No es nada extraño. Es el mismo comportamiento en todos los tiempos de ejecución, ya sea en tiempo de ejecución C/C++ o de lo contrario. Entonces, realmente no entiendo "por qué" el "por qué" de tu lado :) –

+1

"Cualquier tipo de datos primitivos ... están en el montón" es un poco confuso. El montón almacena primitivas si son miembros de datos de objetos. –

+0

Sí. Sí. Pero, como mencionaste, como parte de Composites. Sin embargo, en el momento en que accedemos a los datos, primero se copia en la pila. Por ejemplo, para un objeto con definición ComplexNumber {float real, float imaginary}, en un método doWork (ComplexNumber cn} {return cn.real * cn.real + float.imaginary * float.imaginario; } los valores real/imaginario se traen primero a la pila unline cn donde solo se trae la referencia a la pila –

3

Es muy fácil:

  • objetos (es decir, las instancias de clases) son siempre en el montón. No pueden estar en ningún otro lado
    • campos son parte de los objetos, por lo que también viven en el montón.
  • variables locales (incluido el método/constructor) los parámetros son siempre en la pila. No pueden estar en ningún otro lado.

Nótese que las variables locales pueden sólo referencias de bodega ("punteros") o valores primitivos. Una variable local no puede contener "un objeto".

Tenga en cuenta que esta vista es lo que se define en la especificación de JVM. Una JVM concreta podría asignar objetos en un área no apilada si lo desea. Por ejemplo: si sabe que un objeto recién creado nunca escapa de la invocación actual, entonces podría poner el objeto instanciado en el área de la pila. Sin embargo, esa es una gran optimización que no es visible para el desarrollador.

0

Primitives: Pila

objetos: Montón

Temas: tener una pila separada, mientras que compartir el mismo montón.

+0

no son primitivas; ¿se almacenan en el montón si son variables de instancia? y en la pila si son variables locales? – Mike

0

@Joachim Sauer

Si lo que dice es cierto, entonces ¿por qué, en el código siguiente,

class Student{ 

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

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

Entonces ¿por qué no es 'name = "Anónimo"; 'una variable local ?? ¿Qué tipo de variable es y dónde vive?