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.
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.
Vytvořte statickou mapu a přidávejte do ní pevné odkazy. Ty nebudou nikdy 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); }
}