Creación de una fuga de memoria con Java

Acabo de tener una entrevista y me han pedido que cree una fuga de memoria con Java.
No hace falta decir que me sentí bastante tonto al no tener ni idea de cómo empezar a crear una.

¿Cuál sería un ejemplo?

Una cosa sencilla es utilizar un HashSet con un hashCode() o equals() incorrecto (o inexistente), y luego seguir añadiendo "duplicados". En lugar de ignorar los duplicados como debería, el conjunto sólo crecerá y no podrás eliminarlos.

Si quieres que estas claves/elementos malos permanezcan, puedes usar un campo estático como

class BadKey {
   // no hashCode or equals();
   public final String key;
   public BadKey(String key) { this.key = key; }
}

Map map = System.getProperties();
map.put(new BadKey("key"), "value"); // Memory leak even if your threads die.
Comentarios (17)

¿Tal vez utilizando código nativo externo a través de JNI?

Con Java puro, es casi imposible.

Pero se trata de un tipo de fuga de memoria "estándar", cuando ya no se puede acceder a la memoria, pero sigue siendo propiedad de la aplicación. En cambio, puedes mantener referencias a objetos no utilizados, o abrir flujos sin cerrarlos después.

Comentarios (4)

Crea un Mapa estático y sigue añadiendo referencias duras a él. Esas nunca serán GC's.

public class Leaker {
    private static final Map CACHE = new HashMap();

    // Keep adding until failure.
    public static void addToCache(String key, Object value) { Leaker.CACHE.put(key, value); }
}
Comentarios (8)