Java tiene garbage collector. ¿Cómo puede un programa Java tener aun así una fuga de memoria?
Opciones
- No puede, porque el GC siempre libera todos los objetos
- Manteniendo referencias a objetos que ya no necesita (Opción correcta)
- Solo llamando a
System.gc()demasiadas veces seguidas - 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.