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?
El objeto EjemploStackAndHeap y sus variables se van al Heap, las variables que se van al stack son las que creas en metodos.
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!!!
Asi es, el String s del metodo y atributo cadena apuntan a la misma referencia: cadenaLocal.
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?
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.