Я прочитал несколько сообщений о сборке мусора на Java, но все же я не могу решить, является ли очистка коллекции явным образом хорошей практикой или нет ... и так как я не мог найти ясного ответа, я решил спросить его здесь.Сборщик мусора против коллекций
Рассмотрим следующий пример:
List<String> list = new LinkedList<>();
// here we use the list, perhaps adding hundreds of items in it...
// ...and now the work is done, the list is not needed anymore
list.clear();
list = null;
Из того, что я видел в реализациях, например, LinkedList
или HashSet
, метод clear()
в основном только петли всех элементов данной коллекции, устанавливая все его элементы (в случае LinkedList
также ссылок на последующие и предыдущие элементы) для null
Если бы я получил это право, установив list
до null
просто удаляет одну ссылку от list
- учитывая, что это была единственная ссылка на нее, сборщик мусора в конечном итоге позаботится об этом. Я просто не знаю, сколько времени потребуется, пока в этом случае элементы списка не будут обработаны сборщиком мусора.
Итак, мой вопрос: сделайте последние две строки приведенного выше кода примера, чтобы помочь сборщику мусора работать более эффективно (т.е. собирать элементы списка раньше) или я просто сделаю свое приложение занятым «нерелевантными задачами» «?
Это может быть полезно, чтобы добавить к вашему ответу комментария о анализе эвакуации Java 1.7 и далее. Мне вообще нравится ответ. Благодарю. – Sam
@sam Что бы сказал это дополнение? Я не знаю, что случилось с анализом побега в Java 1.7 и дальше. –
У меня не так много подробностей, поэтому я надеялся, что у вас есть что сказать. ;) Как я понимаю, во время компиляции и объекта можно определить, что срок службы вызова метода будет и будет выделен в стеке выполнения. В этом случае обнуление и очистка этого объекта становится еще более ненужным, так как всплытие стека будет очень быстро обрабатывать вещи. Google показывает это: http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html#zeroBasedCompressedOop – Sam