Vytvoření úniku paměti v jazyce Java

Právě jsem měl pohovor a byl jsem požádán, abych vytvořil memory leak v Javě.
Nemusím říkat, že jsem si připadal dost hloupě, když jsem neměl ani ponětí, jak takový únik začít vytvářet.

Jaký by měl být příklad?

Jednoduché je použít sadu HashSet s nesprávným (nebo neexistujícím) kódem hashCode() nebo equals(), a pak neustále přidávat "duplikáty". Místo aby duplikáty ignorovala, jak by měla, bude se množina stále jen zvětšovat a vy je nebudete moci odstranit.

Pokud chcete, aby se tyto špatné klíče/elementy zdržovaly, můžete použít statické pole, např.

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.
Komentáře (17)

Možná pomocí externího nativního kódu prostřednictvím JNI?

V čisté Javě je to téměř nemožné.

Ale to se jedná o "standardní" typ úniku paměti, kdy již nelze přistupovat k paměti, ale ta je stále ve vlastnictví aplikace. Místo toho si můžete ponechat odkazy na nepoužívané objekty nebo otevřít proudy, aniž byste je následně uzavřeli.

Komentáře (4)

Vytvořte statickou mapu a přidávejte do ní pevné odkazy. Ty nebudou nikdy GC'd.

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); }
}
Komentáře (8)