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.
¿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.
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<String, Object> CACHE = new HashMap<String, Object>();
// Keep adding until failure.
public static void addToCache(String key, Object value) { Leaker.CACHE.put(key, value); }
}