Java: Этого достаточно для удаления объектов? - PullRequest
1 голос
/ 11 октября 2011

У меня есть HashMap, в котором хранятся ссылки на мои прикладные модули.

HashMap<String, Module> modules;

Когда я делаю это:

for(String key:modules.keySet()){
   modules.remove(key);
}

Не должно быть больше ссылок на объекты, поэтому они должны быть удалены GC в какой-то момент. Я прав или я что-то упустил? Это безопасно или можно как-то восстановить доступ к объектам?

Это то же самое, что происходит при выполнении:

modules.clear();

В конце концов, более сложный вопрос: когда я делаю это с GWT, насколько я могу быть уверен, что объекты пропали в браузере? Я хотел бы сделать это при выходе пользователя из системы, чтобы тот, кто использует компьютер рядом, не мог получить какую-либо информацию от предыдущего пользователя. Конечно, большинство модулей «забывают» свои данные unDetach (), но я не уверен, что все они делают. Эта информация является плюсом, конечно, если кто-то узнает, я был бы благодарен =)

Ответы [ 4 ]

5 голосов
/ 11 октября 2011

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

3 голосов
/ 11 октября 2011

Для первых нескольких вопросов, касающихся сбора мусора в Java:

Метод remove(key) HashMap - это безопасный способ удаления объекта из коллекции.Это гарантирует, что объект больше не будет ссылаться на коллекцию.Однако это само по себе не гарантирует, что на объект не ссылаются также никакие другие ссылки - вы, как программист, должны это гарантировать.Если действительно нет других ссылок на него, объект будет собран в какой-то момент времени.То же самое верно и для метода clear().Если вы не допустили какой-либо другой ошибки программирования, связанной с доступом к ссылкам на ваши объекты, никто не сможет получить доступ к этим мусору объектам.

Примечание. Используйте явное Iterator.remove() вместо удаления элементовцикла for.Ваш текущий путь склонен к ConcurrentModificationException.

1 голос
/ 11 октября 2011

Вопрос скорее в том, кто и что еще имеет доступ к вашим модулям.Если есть вероятность того, что какая-то другая часть вашей программы могла получить ссылку на один из ваших модулей, вы не можете быть уверены, что GC удалит модуль.

В любом случае вам не следует полагаться наGC, чтобы сделать что-нибудь.Он будет работать только в том случае, если требуется больше места, и это система для очистки памяти после завершения работы приложения.Если вы хотите быть уверенным в том, что никакой разумной информации нет, удалите ее явно.

0 голосов
/ 11 октября 2011

Просто вставьте эту строку в ваш код:

modules = null;

Затем GC обнаруживает, что больше нет ссылки на этот объект, и очищает его

...