1) Это избыточно?
Да.
2) Я делаю больше вреда, чем пользы?
Да.
3) Это хорошо в любом случае?
Нет.
4) Почему?
Вызов clear()
для ArrayList
изменяет поле size
списка и затем тщательно присваивает null
элементам его резервного массива, которые только что стали недействительными.Код clear()
должен сделать это, потому что ссылки в этих элементах могут сделать другие объекты доступными;то есть утечка памяти.
Однако, когда ArrayList
становится недоступным, сборщик мусора не будет никогда смотреть на любые элементов резервного массива,Процесс маркировки GC только перебирает достижимые объекты, а процесс восстановления не смотрит на содержимое мусорных объектов / массивов.
Таким образом, в основном, вызывая clear()
для объекта, который он собирается стать недоступнымэто полная трата циклов ЦП и пропускной способности памяти / ВМ.(И, конечно, является излишним код, следующий парень собирается почесать голову о ...)
На самом деле, это даже спорно ли вызова clear
, а затем повторно использовать список являетсяХорошая идея:
Вызов clear
не освобождает / не изменяет размер резервного массива, так что вы можете остаться с огромным резервным массивом для списка, размер которого обычно мал.
Не исключено, что сборщик мусора может освободить достаточно большой массив и выделить новый такой же размер быстрее , чем clear()
может это сделать.работа.(Для начала, GC может использовать несколько процессоров, где вызов clear()
будет выполняться в одном потоке.)
Существует ли сценарий, который действительно оправдывает вызов clear()?
Единственный сценарий, когда абсолютно необходимо очистить / повторно использовать список, - это когда кто-то ссылается на этот конкретный список , и вы не можете обновить ссылки на список.
Также может быть полезно очистить / повторно использовать списки на платформе с ограниченной памятью и / или медленным сборщиком мусора.Тем не менее, я бы не стал пытаться провести эту «оптимизацию», если бы у меня не было СИЛЬНОГО доказательства того, что это проблема.(Этот вид оптимизации усложняет ваш код и может привести к проблемам с производительностью, если он выполняется неправильно.)