Repaso
English
Java CoreAvanzadoJV-29

Java tiene garbage collector. ¿Cómo puede un programa Java tener aun así una fuga de memoria?

Opciones

  1. No puede, porque el GC siempre libera todos los objetos
  2. Manteniendo referencias a objetos que ya no necesita (Opción correcta)
  3. Solo llamando a System.gc() demasiadas veces seguidas
  4. Solo usando primitivos en lugar de objetos en todas partes

Respuesta

Manteniendo referencias a objetos que ya no se necesitan, por ejemplo un map o caché static que solo crece, listeners olvidados o ThreadLocals sin limpiar

Por qué

El GC libera los objetos que ya nadie puede alcanzar. Una fuga en Java significa que los objetos siguen siendo alcanzables (algo aún apunta a ellos) pero tu programa nunca volverá a usarlos.

Causas típicas: un Map static usado como caché sin límite de tamaño ni caducidad; listeners o callbacks registrados y nunca eliminados; valores ThreadLocal en threads de un pool; recursos sin cerrar.

Síntomas: el heap crece hasta el OutOfMemoryError. Herramientas: heap dump + Eclipse MAT, VisualVM, JFR.

Recuerda

Fuga = sigue alcanzable pero nunca se vuelve a usar.

Términos clave

Practica esta pregunta en Repaso