Je viens d'avoir un entretien, et on m'a demandé de créer une fuite de mémoire avec Java.
Inutile de dire que je me suis sentie assez stupide, n'ayant aucune idée de la façon de commencer à en créer une.
Quel serait un exemple ?
Une chose simple à faire est d'utiliser un HashSet avec un hashCode()
ou un equals()
incorrect (ou inexistant), puis de continuer à ajouter des "doublons". Au lieu d'ignorer les doublons comme il se doit, l'ensemble ne fera que croître et vous ne pourrez pas les supprimer.
Si vous voulez que ces mauvaises clés/éléments restent en place, vous pouvez utiliser un champ statique tel que
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.
Peut-être en utilisant du code natif externe via JNI ?
Avec du pur Java, c'est presque impossible.
Mais il s'agit d'un type "standard" de fuite de mémoire, lorsque vous ne pouvez plus accéder à la mémoire, mais qu'elle appartient toujours à l'application. Vous pouvez au contraire conserver des références à des objets inutilisés, ou ouvrir des flux sans les fermer ensuite.
Créez une carte statique et continuez à y ajouter des références dures. Celles-ci ne seront jamais traitées par GC.
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); }
}