Ho appena avuto un colloquio, e mi è stato chiesto di creare un memory leak con Java.
Inutile dire che mi sono sentito piuttosto stupido, non avendo idea di come iniziare a crearne uno.
Quale potrebbe essere un esempio?
Una cosa semplice da fare è usare un HashSet con un hashCode()
o equals()
errato (o inesistente), e poi continuare ad aggiungere "duplicati". Invece di ignorare i duplicati come dovrebbe, l'insieme crescerà sempre di più e non sarete in grado di rimuoverli.
Se volete che queste cattive chiavi/elementi rimangano in giro, potete usare un campo statico come
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.
Forse usando codice nativo esterno attraverso JNI?
Con Java puro, è quasi impossibile.
Ma si tratta di un tipo "standard" di perdita di memoria, quando non si può più accedere alla memoria, ma è ancora di proprietà dell'applicazione. Si possono invece mantenere riferimenti a oggetti inutilizzati, o aprire streams senza chiuderli dopo.
Creare una mappa statica e continuare ad aggiungere riferimenti rigidi ad essa. Questi non saranno mai GC'd.
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); }
}