Práve som mal pohovor a požiadali ma, aby som v Jave vytvoril memory leak.
Netreba ani hovoriť, že som sa cítil dosť hlúpo, keď som nemal ani poňatia o tom, ako ho začať vytvárať.
Aký by mal byť príklad?
Jednoduché je použiť HashSet s nesprávnym (alebo neexistujúcim) hashCode()
alebo equals()
a potom neustále pridávať "duplikáty". Namiesto toho, aby sa duplikáty ignorovali, ako by sa malo, množina sa bude stále len zväčšovať a vy ich nebudete môcť odstrániť.
Ak chcete, aby sa tieto zlé kľúče/elementy zdržiavali, môžete použiť statické pole, napr.
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žno použitím externého natívneho kódu prostredníctvom JNI?
S čistou Javou je to takmer nemožné.
Ale to je o "štandardnom" type úniku pamäte, keď už nemôžete pristupovať k pamäti, ale tá je stále vo vlastníctve aplikácie. Namiesto toho si môžete ponechať referencie na nepoužívané objekty alebo otvoriť prúdy bez toho, aby ste ich následne uzavreli.
Vytvorte statickú mapu a pridávajte do nej pevné odkazy. Tie nikdy nebudú 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); }
}