Introducción Stack y Heap en Java

Buenos días, en esta entrada veremos un pequeño resumen sobre el Stack y Heap y como son usados por Java.


Para la mayoría de la gente, entender las básicas del Stack y Heap hace que se entienda mejor tópicos como el paso de argumentos, polimorfismo, hilos, excepciones y el garbage collector de Java. Vamos a ver por encima como usa Java estas utilidades en un ejemplo de código.

En mayor parte, las varias piezas (métodos, variables, y objetos) de los programas de Java viven en una de las 2 partes de la memoria: el Stack o el Heap. Por ahora, vamos a preocuparnos solo de 3 cosas: variables de instancia, variables locales y objetos.

  • Variables de instancia y objetos viven en el Heap
  • Variables locales viven en el Stack

Vamos a echar un vistazo de un programa Java, y como sus varias piezas son creadas y se colocan en el Stack y en el Heap:

class Collar{ }

public class Dog {
    Collar c;       // Variable de Instancia
    String name;    // Variable de Instancia
    
    public static void main (String[] args){
        
        Dog d;
        d = new Dog();
        d.go(d);
    }
    void go (Dog dog){
        c = new Collar();
        dog.setName("Aiko");
    }
    void setName(String dogName){
        name = dogName;
        // Se realizan otras cosas
    }
}

Vamos a analizar un poco el código viendo lo que pasa:

  • Linea 7 – main() se coloca en el Stack.
  • Linea 9 – La variable de referencia d es creada en el Stack, pero aun no hay objeto Dog.
  • Linea 10 – Se crea un nuevo objeto Dog y es asignado a la variable de referencia d.
  • Linea 11 – Una copia de la variable de referencia d es pasada al método go().
  • Linea 13 – El método go() se coloca en el Stack, con el parámetro dog como variable local.
  • Linea 14 – Se crea un nuevo objeto Collar en el Heap, y es asignado a la variable de instancia de Dog.
  • Linea 17 – setName() es añadido al Stack, con el parámetro de dogName como su variable local.
  • Linea 18 – La variable de instancia name ahora tambien se refiere a un objeto String.
  • Vemos que hay 2 variables locales diferentes que se refieren al mismo objeto Dog.
  • Vemos que una variable local y una variable d einstancia ambas se refieren al mismo String Aiko.
  • Una vez se completa la Linea 19, el método setName() se completa y es removido del Stack. En este pnto la variable local dogName desaparece también, aunque el objeto String que estaba referido el se mantiene aún en el Heap.

Con este ejemplo podremos haber visto un poco como va funcionando el Stack y el Heap, y donde se colocan las diferentes piezas de nuestro código, aunque esto es solo una vista muy por encima y mas adelante lo estudiaremos mas a fondo.

Sin más, cualquier aporte o corrección es bienvenido.

Saludos!!!

  • Icaro

    Gracias por la aportación, me ha servido bastante.

    • Me alegro de que te haya sido útil Icaro :-).
      Saludos!