Создание утечки памяти с Java - PullRequest
2986 голосов
/ 24 июня 2011

У меня только что было интервью, и меня попросили создать утечка памяти с Java.
Само собой разумеется, я чувствовал себя довольно глупо, не имея понятия о том, как даже начать создавать его.

Каким будет пример?

Ответы [ 54 ]

0 голосов
/ 06 февраля 2018

Пример утечки памяти в реальном времени до JDK 1.7

Предположим, вы читаете файл из 1000 строк текста и сохраняете в объекте String

String fileText = 1000 characters from file

fileText = fileText.subString(900, fileText.length());

В приведенном выше коде я изначально прочитал 1000char, а затем сделал подстроку, чтобы получить только 100 последних символов.Теперь fileText должен ссылаться только на 100 символов, а все остальные символы должны собирать мусор, поскольку я потерял ссылку, но до того, как функция подстроки JDK 1.7 косвенно ссылается на исходную строку из последних 100 символов, она предотвращает сбор всей строки из мусора, и целые 1000 символов будут тамв памяти, пока вы не потеряете ссылку на подстроку.

вы можете создать пример утечки памяти, как указано выше

0 голосов
/ 27 ноября 2017

Точно так же!

public static void main(String[] args) {
    List<Object> objects = new ArrayList<>();
    while(true) {
        objects.add(new Object());
    }
}
0 голосов
/ 22 января 2017

Из эффективной книги Java

  1. всякий раз, когда класс управляет собственной памятью, программист должен предупреждать об утечках памяти

.

public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;

public Stack() {
    elements = new Object[DEFAULT_INITIAL_CAPACITY];
}

public void push(Object e) {
    ensureCapacity();
    elements[size++] = e;
}

public Object pop() {
    if (size == 0)
        throw new EmptyStackException();
    return elements[--size];
}

/**
 * Ensure space for at least one more element, roughly doubling the capacity
 * each time the array needs to grow.
 */
private void ensureCapacity() {
    if (elements.length == size)
        elements = Arrays.copyOf(elements, 2 * size + 1);
}

}

Можете ли вы обнаружить утечку памяти?Так где же утечка памяти?Если стек увеличивается, а затем сжимается, объекты, извлеченные из стека, не будут собираться мусором, даже если у программы, использующей этот стек, больше нет ссылок на них.Это потому, что стек поддерживает устаревшие ссылки на эти объекты.Устаревшая ссылка - это просто ссылка, которая никогда не будет разыменована.В этом случае любые ссылки вне «активной части» массива элементов являются устаревшими.Активная часть состоит из элементов, индекс которых меньше размера.

0 голосов
/ 11 марта 2015

В Java нет такой вещи, как утечка памяти.Утечка памяти - это фраза, заимствованная у C et al.Java имеет дело с распределением памяти внутри с помощью GC.Существует потеря памяти (то есть, оставление застрявших объектов), но нет утечка памяти .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...