Java ile bellek sızıntısı oluşturma

Az önce bir mülakata girdim ve benden Java ile bir bellek sızıntısı oluşturmam istendi.
Söylemeye gerek yok, bir tane oluşturmaya nasıl başlayacağıma dair hiçbir fikrim olmadığı için kendimi oldukça aptal hissettim.

Örnek ne olabilir?

Yapılması gereken basit bir şey, yanlış (veya var olmayan) hashCode() veya equals() içeren bir HashSet kullanmak ve ardından "duplicates" eklemeye devam etmektir. Yinelenenleri olması gerektiği gibi yok saymak yerine, küme yalnızca büyüyecek ve onları kaldıramayacaksınız.

Bu kötü anahtarların/elemanların etrafta takılmasını istiyorsanız, aşağıdaki gibi statik bir alan kullanabilirsiniz

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.
Yorumlar (17)

Belki JNI aracılığıyla harici yerel kod kullanarak?

Saf Java ile bu neredeyse imkansızdır.

Ancak bu, belleğe artık erişemediğinizde, ancak hala uygulamaya ait olduğunda, "standart" bir bellek sızıntısı türü ile ilgilidir. Bunun yerine kullanılmayan nesnelere referanslar tutabilir veya daha sonra kapatmadan akışları açabilirsiniz.

Yorumlar (4)

Statik bir Harita oluşturun ve ona sabit referanslar eklemeye devam edin. Bunlar asla GC'lenmeyecektir.

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); }
}
Yorumlar (8)