Сколько памяти освободится после вызова list.clear() для ArrayList с 1 млн элементов Integer?

Ответ

Вызов list.clear() для ArrayList<Integer> с 1 млн элементов не освобождает память, занятую внутренним массивом, но позволяет GC собрать сами объекты Integer.

Детализация:

  1. Память внутреннего массива (elementData)

    • Метод clear() устанавливает size = 0 и обнуляет (null) ссылки в массиве, но не уменьшает его емкость (capacity).
    • Массив из 1 млн ссылок (~4 байта каждая при -XX:+UseCompressedOops) продолжает занимать ~4 МБ.
  2. Память объектов Integer

    • После clear() ссылки на 1 млн объектов Integer теряются.
    • Если других ссылок на эти объекты нет, они становятся кандидатами на сборку мусора (GC).
    • Память под сами объекты (примерно 16 байт на объект) будет освобождена во время следующей сборки мусора.

Пример и управление памятью:

import java.util.ArrayList;

public class MemoryDemo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        // Заполняем 1 млн элементов
        for (int i = 0; i < 1_000_000; i++) {
            list.add(i); // Автоупаковка int -> Integer
        }
        System.out.println("Size after fill: " + list.size());

        // 1. clear() освобождает только ссылки
        list.clear();
        System.out.println("Size after clear: " + list.size());
        // Внутренний массив все еще имеет capacity на 1 млн элементов (~4 МБ).

        // 2. Чтобы уменьшить внутренний массив, нужно:
        list.trimToSize(); // Теперь capacity = size = 0
        // ИЛИ
        list = new ArrayList<>(); // Старый ArrayList будет собран GC
    }
}

Итог: Сразу после clear() остается ~4 МБ под внутренний массив ссылок. Память объектов Integer (~16 МБ) освободится после работы GC.

Ответ 18+ 🔞

А, ну это же классика, блядь! Сидишь такой, думаешь — очистил список, и память свободна, как птица, нахуй! Ан нет, сука, не тут-то было.

Вот смотри, ты накрутил ArrayList на миллион этих самых Integer. Каждый Integer — это отдельный объект, ёпта, со своей шапкой и бородой, в куче торчит. И сам список, этот хитрожопый, внутри себя держит массив, куда он ссылки на эти объекты пихает.

И вот ты вызываешь list.clear(). И что он делает, этот clear()? Он не массив свой, сука, сжигает! Он просто пробегает и зануляет все ссылки в нём, а счётчик размера (size) в ноль сбрасывает. А массив-то, блядь, остаётся! Весь этот elementData на миллион ячеек так и болтается в памяти, как манда с ушами. Это тебе ещё 4 мегабайта, если сжатые указатели включены.

А что с самими объектами Integer? А вот с ними-то как раз всё хорошо! На них больше никто не ссылается, они стали сиротами, блядь. И сборщик мусора (GC), когда проснётся и решит поработать, этих сирот соберёт и память освободит. Это примерно 16 мегабайт, ёбана.

Но внутренний-то массив списка — он же всё ещё живёт! Он не стал кандидатом на удаление, потому что на сам ArrayList ссылка-то осталась. Он просто теперь пустой, но с ёбаным запасом на миллион элементов.

import java.util.ArrayList;

public class MemoryDemo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        // Напихиваем дохуя элементов
        for (int i = 0; i < 1_000_000; i++) {
            list.add(i); // int в Integer, автоупаковка, всё дела
        }
        System.out.println("Size after fill: " + list.size());

        // 1. clear() — только ссылки зануляет!
        list.clear();
        System.out.println("Size after clear: " + list.size());
        // А внутренний массив capacity на 1 млн ячеек (~4 МБ) — на месте, сука!

        // 2. Хочешь по-честному освободить? Тогда так:
        list.trimToSize(); // Теперь capacity = size = 0, массив сожмётся
        // ИЛИ вообще по-пацански:
        list = new ArrayList<>(); // Старый ArrayList отправится на свалку истории к GC
    }
}

Короче, итог, блядь: clear() — это не «освободить всё», а «забыть, что там было». Память под объекты (Integer) освободит GC, а память под внутренний массив так и будет висеть, пока ты её специально не урежешь (trimToSize) или список нахуй не выбросишь. Вот такие пироги, ёпта.