Manejo de Memoria en Java

César Estrada Yglesias
3 min readNov 4, 2023

--

  • ¿Te has preguntado donde se guardan los objetos que creas a medida que vas desarrollando?
  • ¿Todos estos objetos, primitivos y funciones van a un mismo lugar o de que depende esto?
  • ¿Debo tener en cuenta esto para que mi aplicación no presente problemas de memoria o performance durante su ejecución?

Slack es una aplicación que todos conocemos y hemos usado alguna vez, más aún si somos del mundo del desarrollo de software. Muy pocos saben o recuerdan que los primeros problemas que tuvo slack al salir al mercado fueron los problemas de memoria, variables que no se limpiaban a tiempo de la mano con un ineficiente manejo y administración de memoria.

Habían momentos que la aplicación consumía el 70% del CPU y muchas personas ni siquiera se percataron. Este problema que fue solucionándose poco a poco a través de sus diferentes versiones pero que en su momento nos dio un claro ejemplo de lo que no se debe de hacer al implementar una solución y más aún si esta planea ser de un tamaño considerable.

Esto nos lleva a preguntarnos como es que la gestión de memoria se realiza en nuestras aplicaciones y como esto puede afectar el rendimiento a medida que esta se va ejecutando. Por eso hoy hablaremos de las 2 principales estructuras de datos que gestionan la memoria en nuestras aplicaciones de los diferentes lenguajes de programación para tener un mejor entendimiento del manejo de memoria. Estas 2 principales estructuras de datos son:

  • HEAP
  • STACK

¿Qué es el el Stack?

Stack, comúnmente conocida como call stack, es una estructura de datos fundamental en la ejecución de aplicaciones que sirve para rastrear la ejecución de métodos y funciones en nuestra aplicación.

Cuando se llama a un método o función en Java, se coloca un nuevo objeto en la parte superior de la pila de llamadas. Este contiene información sobre las variables locales del método, los parámetros, el valor de retorno y otros detalles necesarios para la ejecución del método.

En el stack también se guardan las variables primitivas y las referencias a los objectos(los cuales se guardan en el heap)

¿Qué es el el Heap?

El “heap” es una región de memoria utilizada para almacenar objetos y datos de duración más larga. El heap es un área de memoria donde se almacenan objetos y datos que pueden existir más allá del alcance de un método.

Si hablamos particularmente de Java, tenemos una sección específica en el heap que se encarga de almacenar los Strings que se van creando durante la aplicación para una reutilización y mejoras en performance que se van implementando en cada versión de la JVM.

¿Qué pasaría si ejecuto las siguientes lineas de código?

int x = 1;
int y = 2;
Form1 frm = new Form1();

Los primitivos van al stack, los objetos se ubican en el heap.

Si tuviéramos métodos y funciones, todos estos se guardan en el stack.

¿ Donde es que se ejecuta la limpieza de los objetos en cada lenguaje de programación ?

Sabemos que todos los objetos se guardan en el heap, debido a eso cada lenguaje de programación implementa sus diferentes formas de limpieza de heap. Existen algunos lenguajes donde esta limpieza se tiene que hacer totalmente manual como Rust, otros lenguajes donde existe un sistema de limpieza de objetos automatizado como en Java, donde se usa el Garbage collector.

Bien, ya tengo una idea de como funciona el manejo de memoria en java, pero… ¿Cómo puedo hacer un análisis de la memoria de mi aplicación?

Tenemos un artículo donde revisamos como hacer un análisis de la memoria de nuestra aplicación, lo encuentras a continuación.

Véase también:

Espero haber podido ayudar.

Nos vemos.

--

--