является ли этот код причиной утечки памяти в Java?

#java

#java

Вопрос:

     ArrayList<Object> list = new ArrayList<Object>();
    for (int i = 0; i < 10; i  ) {
        Object o = new Object();
        list.add(o);
    }
    list = null;
  

или

     ArrayList<Object> list = new ArrayList<Object>();
    for (int i = 0; i < 10; i  ) {
        Object o = new Object();
        list.add(o);
        o = null;
    }
  

какой блок кода вызовет утечку памяти в Java, почему?

Если ни один из них не вызовет утечку памяти, как я могу вызвать утечку памяти ~ (я хочу немного кода)

Комментарии:

1. Ни то, ни другое, что на земле заставляет вас думать, что один из них будет? Это вопрос домашнего задания?

2. однако вы понимаете, что все, что цикл сделал в первую очередь, пошло прахом сразу после выхода, когда вы установили для своего списка значение null 🙂

3. Почему вы изменили String на Object? Все, что вы сделали, это превратили рабочую программу (без утечек памяти) в программу с ошибками компиляции!

Ответ №1:

Я не думаю, что в приведенном выше коде происходит какая-либо утечка памяти. Даже если вы устанавливаете значение s равным нулю, на объект «string» все равно ссылаются элементы ArrayList. Таким образом, у этих строковых объектов все еще есть активные ссылки после завершения цикла.

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

Комментарии:

1. Однако ситуация, описанная в ссылке, не является реальной утечкой памяти. Я полагаю, вы могли бы назвать это утечкой памяти, если хотите, но это явно отличается от утечки памяти в стиле C, потому что объект, занимающий память, все еще доступен, и поэтому его, в принципе, можно восстановить в какой-то момент позже в программе.

Ответ №2:

Ни один из случаев не приведет к утечке памяти, и все объекты автоматически освобождаются в конце блока кода.

Ответ №3:

Ни в одном из примеров нет утечки памяти. В Java не стоит явно устанавливать для переменной значение null, просто чтобы немного помочь сборщику мусора.

Обратите внимание, что бывают ситуации, когда для долговременных ссылок на большие объекты (скажем, в кэше) необходимо установить значение null, чтобы избежать неограниченного роста памяти (утечек).