Удаление объектов из коллекций Java - PullRequest
0 голосов
/ 13 января 2009

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

Если я сделаю map.clear() и те объекты, которые были в таблице, больше нигде не указаны, будут ли они собирать мусор?

Какой самый быстрый способ - фактически удалить все записи из таблицы, но также уничтожить эти объекты.

Ответы [ 6 ]

8 голосов
/ 13 января 2009

Да, если коллекция является последним местом, на которое ссылаются эти объекты, они имеют право на сборку мусора после того, как они были удалены из коллекции. И нет, вы не можете уничтожить эти объекты силой. Сборщик мусора справится с ними, когда захочет.

2 голосов
/ 13 января 2009

Вообще говоря, у вас нет сильного контроля над тем, когда объект специально уничтожается. Любой объект имеет право на сборку мусора, когда на него больше нет (сильной) ссылки - но нет никаких гарантий относительно того, когда он будет собираться мусором или фактически, когда это будет. Даже вызов System.gc () или Runtime.gc () не дает никаких гарантий о том, что на самом деле что-то делается, это всего лишь подсказка JVM, что она может захотеть рассмотреть сбор мусора сейчас. Я полагаю, что единственная гарантия, которую вы получите, заключается в том, что если выдается ошибка OutOfMemoryError, все потенциальные сборки мусора были выполнены до того, как была выдана ошибка.

Здесь есть последствия для обработки конфиденциальной информации, такой как пароли. Поскольку строки не могут быть очищены программно, в идеале вы не хотите хранить пароль как таковой. Если вместо этого вы сохраните его как массив символов, вы можете использовать Arrays.fill(' ') для перезаписи пароля и гарантии, что с этого момента он больше не будет храниться в памяти.

Вернемся к теме - вы правы, что обе операции сделают объект пригодным для сбора мусора, если на него не ссылаются в другом месте. Collection.clear () действительно является самым быстрым способом удаления ссылок на все объекты в коллекции одновременно.

2 голосов
/ 13 января 2009

Если единственная оставшаяся ссылка на объект находится в этой таблице, то будет ли объект собирать мусор?

Если нет других ссылок на объект, то этот объект будет собираться мусором в будущем.

Вы не должны форсировать разрушение объектов. Если они являются очень тяжелыми объектами (или у вас слишком много объектов для размещения в памяти), это указывает на более фундаментальную проблему с вашим кодом.

Если вам действительно нужно, тогда вы можете позвонить System.gc(), хотя это не очень хорошая практика и всегда будет вожаком основных проблем в вашем коде.

2 голосов
/ 13 января 2009

Обратите внимание, что WeakHashMap позволяет вам размещать объекты в нем и предоставлять им право на сборку мусора, как только больше нет ссылок на ключ (не значение) вне карты - запись карты будет исчезнуть в этот момент.

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

1 голос
/ 13 января 2009

Чтобы собрать что-то по-настоящему мусор, не должно быть строгих ссылок на объект. Объекты с слабой ссылкой могут быть сборщиком мусора . Используйте WeakHashMap, чтобы убедиться, что они являются сборщиком мусора, так как в HashMap все еще есть ссылки на объект.

0 голосов
/ 13 января 2009

Вы можете инициировать вызов System.gc () после очистки карты, но обычно это не очень хорошая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...