Sobes.tech
Назад к вопросам
Junior — Middle
103

Какой объем памяти освобождается при вызове метода clear у списка, содержащего 1 миллион объектов типа Integer, занимающего 48 Мб памяти?

Компании, где спрашивали
СБЕР ТехСБЕР Тех

Ответ от нейросети

sobes.tech AI

При вызове метода clear() у списка в Java удаляются все ссылки на объекты, хранящиеся в списке, то есть элементы списка становятся недоступными для дальнейшего использования через этот список.

Однако сам список (например, ArrayList) освобождает память только для внутреннего массива ссылок, а не для самих объектов Integer. Объекты Integer остаются в памяти до тех пор, пока на них существуют ссылки где-либо еще.

Если список содержал 1 миллион объектов Integer и занимал 48 Мб, то после вызова clear():

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

Таким образом, вызов clear() освобождает память, занимаемую внутренними структурами списка и позволяет сборщику мусора освободить память, занятую объектами, если они не используются больше нигде.

Пример:

List<Integer> list = new ArrayList<>();
// добавляем 1_000_000 элементов
for (int i = 0; i < 1_000_000; i++) {
    list.add(i);
}
// занимаемая память примерно 48 Мб

list.clear(); // ссылки на объекты удалены
// объекты Integer могут быть удалены сборщиком мусора