![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Если надо почистить коллекцию, что лучше - вызвать метод clear() или заменить новой пустой? Замена на новую выглядит предпочтительнее в смысле потокобезопасности. А метод clear(), который ставит null всем элементам коллекции, наверное лучше в смысле уборки мусора.
|
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
Думаю, что это от конкретной ситуации зависит.
Например, не всегда есть возможность заменить объект-коллекцию на новый. Если она объявлена как final, то в ходу только clear(). Так же, осмелюсь предположить, что замена коллекции на новую, будет работать быстрее, чем очистка методом clear() . Поскольку при очистке нужно выставить в null большое количество элементов. Поэтому, если коллекция велика, то лучше заменить её на новую. Если не очень велика или время очистки не критично, то подойдёт и clear(). Это сообщение отредактировал(а) powerOn - 11.1.2008, 22:18 |
|||
|
||||
| Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 24 Всего: 144 |
COVD, правило большого пальца тут такое:
Если коллекция никому не нужна, бросаем ее и создаем новую. Сборщик мусора со временм подхватит ее и оприходует. Если имеются другие объекты, которые содержат ссылку именно на эту коллекцию, то особых выборов не остается: надо зачищать ту что есть. Например, если в пользовательской сессии хранится объект типа Покупательская Корзинка, а в нем - список выбранных товаров, то по нажатию на кнопку Очистить корзину, естественно, лучше очистить существующий экземпляр списка, потому что он может быть связан с кучей других объектов модели данных. А вот если мы заводим какой-то служебный список при реализации некоего алгоритма, и его область видимости сугубо локальная, то проще при каждой итерации инициализировать списковую переменную девственно новым списком, чем затирать и переиспользовать старый. Вот так вот примерно -------------------- "If you want something done right, do it yourself" По секрету: выучить английский - реально! |
|||
|
||||
| w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
Но если её предварительно почистить, то сборщику действительно будет значительно легче. -------------------- ![]() ![]() |
|||
|
||||
| Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 24 Всего: 144 |
Вообще-то я всегда считал, что главная идея со сборщиком мусора заключалась в том, чтобы легче было мне, а не ему Если продолжать следовать вашей логике, можно из жалости к ресурсам отказаться от механизма исключений и вернуться к повальной практике анализа кода возврата. Но можно пойти и еще дальше! Компилятор, вот не кого не распространилось еще наше милосердие! Облегчим ему работу, сократив имена переменных и функций до однобуквенных! Шютка, в которой, сами знаете... -------------------- "If you want something done right, do it yourself" По секрету: выучить английский - реально! |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Я имел в виду буферы, в которые один поток кладет данные, а другой их все забирает. Но иногда их надо чистить третьим потоком, потому что меняются условия работы. Замена на новую мне нравится тем, что если по недосмотру другой поток что-то все еще делает в буфере, то он спокойно закончит свое дело. Перестраховка. Но вот кому быстрее ее удастся почистить - моему коду или gc? Ведь наверное gc тоже будет сначала ее чистить путем установки в null всех элементов? Действительно ли я значительно облегчу ему работу? Может он это сделает эффективнее? Одно очевидно, что чем раньше "отвязать" от коллекции содержимое, если оно подлежит уборке, тем лучше. А если содержимое не подлежит уборке? Наверное, это уже философия.
Это сообщение отредактировал(а) COVD - 11.1.2008, 23:26 |
|||
|
||||
| w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
Шютки шютками, а неприятный опыт имеется. Хотя вы, конечно, правы. Но здесь ситуация примерно та же, что и с пулами объектов - sun'овцы призывают не делать ничего подобного (говоря о том, что когда-нибудь операция new не будет так тормозить, а сборщик обретёт ИИ -------------------- ![]() ![]() |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Да, "ни в чем себе не отказывайте", gc справится. Однако когда апплетовцев спросили как же быть, ведь нельзя для апплета указать необходимую память (-Xmx, -Xms), то ответом был призыв к экономии. |
|||
|
||||
| batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
По моему опыту общения с ребятами из Sun'а - они отчаянно призывают не делать (почти) ничего для облегчения работы gc. Утверждают, что он всегда лучше справится сам.
-------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |