Man tikko bija intervija, un man lūdza izveidot atmiņas noplūdi ar Java.
Lieki piebilst, ka jutos diezgan muļķīgi, jo nezināju, kā sākt to veidot.
Kāds varētu būt piemērs?
Vienkārši var izmantot HashSet ar nepareizu (vai neesošu) hashCode()
vai equals()
, un pēc tam turpināt pievienot "dublikātus". Tā vietā, lai ignorētu dublikātus, kā tam vajadzētu būt, kopa tikai pieaugs, un jūs nevarēsiet tos dzēst.
Ja vēlaties, lai šie sliktie taustiņi/elementi paliek apkārt, varat izmantot statisku lauku, piem.
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.
Varbūt, izmantojot ārējo vietējo kodu, izmantojot JNI?
Izmantojot tīru Java, tas ir gandrīz neiespējami.
Bet runa ir par "standarta" atmiņas noplūdes veidu, kad atmiņai vairs nevar piekļūt, bet tā joprojām pieder lietojumprogrammai. Tā vietā jūs varat saglabāt atsauces uz neizmantotiem objektiem vai atvērt plūsmas, pēc tam tās neaizverot.
Izveidojiet statisku karti un turpiniet tai pievienot cietās atsauces. Tās nekad netiks 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); }
}