Метод ArrayList.clear() освобождает память?

Если я не ошибаюсь, ArrayList содержит значение мест памяти, в которых хранятся переменные, добавленные в список. Итак, мое предположение заключается в том, что когда вы вызываете метод ArrayList.clear(), он освобождает только вышеупомянутые значения (расположения памяти), но не освобождает эти места памяти. Я попытаюсь проиллюстрировать это на примере:

Скажем, у вас есть текущий статус памяти:

[Memory location] (type of variable) *value*

[1000] (int) 32

[1002] (int) 12

[1003] (float) 2.5

И вы добавляете их в список myList, поэтому он содержит указатели на ячейки памяти 1000, 1002, 1003.

Когда вы вызываете myList.clear(), указатели будут аннулированы, но ячейки 1000, 1002, 1003 памяти будут содержать ранее заданные значения. Я не прав?

Ответы

Ответ 1

Вы правы, потому что память очищается асинхронно сборщиком мусора, а не непосредственно такими библиотечными функциями. clear будет только null вывести их полностью и обновить состояние ArrayList соответственно.

Если какой-либо или все из этих элементов не ссылаются на какую-либо другую часть вашего кода, они становятся пригодными для сбора мусора и могут быть уничтожены + выделены в любое время из вскоре после этого вызова до конца времени.

Ответ 2

clear удаляет только элементы массива

public void clear() {
    modCount++;
    for (int i = 0; i < size; i++)
        elementData[i] = null;
    size = 0;
}

но если мы назовем ArrayList.trimToSize after clear, массив поддержки будет сжат

public void trimToSize() {
    modCount++;
    int oldCapacity = elementData.length;
    if (size < oldCapacity) {
        elementData = Arrays.copyOf(elementData, size);
    }
}

Ответ 3

Нет, он не очистит память. После вас clear().

См. исходный код clear()

 public void More ...clear() {
474         modCount++;
475 
476         // Let gc do its work
477         for (int i = 0; i < size; i++)
478             elementData[i] = null;
479 
480         size = 0;
481     }

Метод делает элементы, подходящие для Мусора Сборщика. Не очищайте их немедленно. После запуска GC они исчезли.

Ответ 4

Ответ на ваш вопрос, это будет БЕСПЛАТНО память. Он просто удалит все ссылки на объекты. Теперь эти объекты могут собираться или не собираться сборщиками мусора в зависимости от того, как они ссылаются в других местах. Например, Объект 1 → Объект 2 ArrayList ссылается → Object 2 ArrayList ссылается → Object 3

В этом случае, после Arraylist.clear(), объект 3 будет иметь право на очистку, но не объект 2.