Contenido de certificación
Buscar
Social
Ofertas laborales ES
« Genéricos y Colecciones. Parte 1: Sobreescribiendo equals y hashCode | Main | Orientación a Objetos (Object Orientation) I »
martes
sep272011

Stack y Heap

 En este artículo vamos a explicar estas dos zonas diferentes de memoria que utiliza la JVM (Java Virtual Machine) de Java.

El Stack (Pila) se utiliza para almacenar variables locales, variables de referencia, parámetros y valores de retorno, resultados parciales. También se utiliza para llevar el control de la invocación y retorno de los métodos.

Cada thread en la JVM tiene asignado un stack privado desde el momento de su creación.

El Heap (Montículo) almacena objetos y sus variables de instancia. Es un espacio de memoria dinámica que se crea al inicio de la máquina virtual y es único.

El administrador de este espacio de memoria dinámica es el sistema de administración de almacenamiento automático o más conocido como Garbage Collector (Recolector de Basura).


Veamos con el siguiente ejemplo qué elementos se sitúan en el Stack y cuáles en el Heap:


public class EjemploStackYHeap{

    int atributoEntero;
    String atributoCadena;    

    public void setAtributoEntero (int x) {
       atributoEntero = x;
    }
          
    public void setAtributoCadena(String s) {
      atributoCadena = s;

    }
    
    public static void main (String[] args){
      int enteroLocal = 5;
      String cadenaLocal = "atributo";
                      
      EjemploStackAndHeap e = new EjemploStackAndHeap();
      e.setAtributoEntero (enteroLocal);
      e.setAtributoCadena (cadenaLocal);
                        
   }
}

 

Ocurriría lo siguiente:

  • Comienza la ejecución con main.
  • Se declara e inicializa una variable de tipo primitivo, enteroLocal.
  • Se almacena esta variable y su valor en el Stack.
  • Se declara e inicializa una variable de tipo de referencia.
  • La variable se crea en el Stack. El objeto se crea en el Heap.
  • La variable apunta al objeto String en el Heap.
  • Se llama al constructor EjemploStackAndHeap(). El constructor crea en el Heap el espacio para el objeto y sus atributos. Se inicializan los valores según el tipo de los atributos. En el Stack se crea la variable de referencia e que apunta al objeto en Heap.
  • Se llama a setAtributoEntero con el parámetro enteroLocal. La variable del método setAtributoEntero x recibe el valor de enteroLocal. Se le asigna el valor de x a atributoEntero. (El método tiene una variable this que apunta al objeto, de esta forma puede acceder a sus atributos).
  • Se llama a setAtributoCadena con el parámetro cadenaLocal. La variable del método setAtributoCadena s recibe el valor de cadenaLocal. Se le asigna el valor de s a atributoCadena. (El método tiene una variable this que apunta al objeto, de esta forma puede acceder a sus atributos).




 

Reader Comments (6)

Estaba leyendo el post y me quede con una gran duda, entonces cuando se crea el objeto EjemploStackAndHeap, sus variables de instancia, en donde se crean? en el heap o en el stack? o en ambas? o solamente los objetos o tienen direcciones de memoria referenciando a el stack?

septiembre 28, 2011 | Unregistered Commenterlynez

El objeto EjemploStackAndHeap y sus variables se van al Heap, las variables que se van al stack son las que creas en metodos.

septiembre 28, 2011 | Unregistered Commentergishac

Asi que en el heap se asigna espacio en memoria para colocar la direccion del objeto String y el valor del entero; del objeto EjemploStackAndHeap. Y el metodo set del objeto lo que hace es pasar la direccion de memoria del objeto String a la direccion del objeto String que se encuentra en el objeto EjemploStackAndHead?, por lo tanto, el argumento del metodo set del String, la variable de referencia de cadenaLocal y la variable de referencia atributoCadena estarian refiriendose al mismo objeto String?

Muchas gracias por contestar tan pronto!! Eso es motivante para la certificacion, saber que no estoy sola!!!

septiembre 28, 2011 | Unregistered Commenterlynez

Asi es, el String s del metodo y atributo cadena apuntan a la misma referencia: cadenaLocal.

septiembre 29, 2011 | Unregistered Commentergishac

Gracias!!! serian apuntan hacia la misma dirección se encuentra en cadenaLocal (que indica la posicion del objeto en memoria)? o apuntan hacia cadenaLocal es decir hacia la direccion de cadenaLocal?

septiembre 30, 2011 | Unregistered Commenterlynez

El string "atributo" tiene una direccion en memoria, al asignar cadenaLocal="atributo" está apuntando a esa dirección, como todos los strings se igualan a lo que tiene cadenaLocal todas las variables apuntan a la misma referencia.

septiembre 30, 2011 | Unregistered Commentergishac

PostPost a New Comment

Enter your information below to add a new comment.

My response is on my own website »
Author Email (optional):
Author URL (optional):
Post:
 
Some HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>