Я щойно пройшов співбесіду, і мене попросили створити витік пам'яті за допомогою Java.
Зайве казати, що я відчував себе досить тупим, не маючи жодного уявлення про те, як навіть почати його створювати.
Що може бути прикладом?
Проста річ, яку можна зробити - це використовувати HashSet з неправильним (або неіснуючим) hashCode()
або equals()
, а потім продовжувати додавати "дублікати". Замість того, щоб ігнорувати дублікати, як це повинно бути, набір буде тільки рости, і ви не зможете їх видалити.
Якщо ви хочете, щоб ці погані ключі/елементи не висіли, ви можете використовувати статичне поле на зразок
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.
Можливо, використовуючи зовнішній нативний код через JNI?
З чистою Java це майже неможливо.
Але мова йде про &quo ;стандартний&quo ; тип витоку пам'яті, коли ви вже не можете отримати доступ до пам'яті, але вона все ще належить програмі. Натомість можна зберігати посилання на невикористовувані об'єкти, або відкривати потоки, не закриваючи їх згодом.
Створіть статичну карту і продовжуйте додавати на неї жорсткі посилання. Це ніколи не буде 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); }
}