Метод 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.