Acabei de ter uma entrevista e foi-me pedido para criar um memory leak com Java.
Escusado será dizer que me senti bastante idiota por não fazer ideia de como começar a criar um.
Qual seria um exemplo?
Uma coisa simples a fazer é utilizar um HashSet com um hashCode()
incorrecto (ou inexistente) ou equivalente()
, e depois continuar a adicionar "duplicados". Ao invés de ignorar as duplicatas como deveria, o conjunto só vai crescer e você não será capaz de removê-las.
Se você quiser que essas chaves/elementos ruins fiquem por perto, você pode usar um campo estático como
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.
Talvez usando código nativo externo através da JNI?
Com Java puro, é quase impossível.
Mas isso é sobre um tipo "padrão" de vazamento de memória, quando você não pode mais acessar a memória, mas ela ainda é de propriedade da aplicação. Em vez disso, você pode manter referências a objetos não utilizados, ou abrir fluxos sem fechá-los depois.
Crie um Mapa estático e continue adicionando referências difíceis a ele. Essas nunca serão 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); }
}