#java #memory-leaks #garbage-collection #jvm #weak-references
#java #утечки памяти #сбор мусора #jvm #слабые ссылки
Вопрос:
Есть ли способ заставить jvm очистить все WeakReferences
(или все ключи a WeakHashMap
), если на них больше не ссылаются обычные ссылки?
Запуск сборки мусора не сработает, слабые ссылки останутся живыми. (Я читал, что слабые ссылки будут очищены только при нехватке памяти).
Комментарии:
1. Почему вы хотите это сделать? Могут быть другие способы достижения вашей реальной цели.l
2. Я хочу убедиться, что мое приложение не протекает. (в настоящее время tomcat обнаруживает «утечки» после остановки моего приложения, и, согласно моему анализатору кучи, это вызвано тем, что слабые ссылки все еще сохраняются)
3. Утечки памяти являются проблемой только в том случае, если у вас заканчивается память. Если вы этого не сделаете, даже реальная утечка памяти совершенно неинтересна. И поскольку слабые ссылки в любом случае не приведут к исключениям ООМ — зачем беспокоиться?
4. @Voo:
Memory leaks are only a problem if you run out of memory
.Интересная мысль…. Я думаю, это правильно, если ваше приложение является единственным запущенным в системе….5. @Voo — вы предполагаете, что ни одна из ваших утечек памяти не разделяет страницы с используемой памятью. Вполне возможно, что эти просочившиеся ссылки израсходуют частичные страницы памяти и вызовут перебои. И обсуждение было связано с вашим общим заявлением о том, что утечки памяти, которые не приводят к ошибке ООМ, не имеют значения, и причины, по которым это может быть неверно.
Ответ №1:
Программные ссылки очищаются при нехватке памяти.
Слабые ссылки очищаются чаще (например, все время, когда у объекта остаются только слабые ссылки)
Ознакомьтесь с официальным документом Java для пакета (документация пакета полезна для объяснения): http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ref/package-summary.html
Можете ли вы процитировать точное сообщение, которое вы видите от Tomcat при завершении работы? вы уверены, что не неправильно истолковываете это? Что важно для Tomcat, так это то, что нет жестких ссылок, которые закрепляют загрузчик классов для ServletContext.
Re WeakHashMap: http://download.oracle.com/javase/1.5.0/docs/api/java/util/WeakHashMap.html Только ключи слабо удерживаются. Что вы используете в качестве «значения»? сильно ли значение ссылается на свой собственный «ключ»? При этом я ставлю под сомнение ваше понимание того, что предоставляет вам WeakHashMap (это предполагает, что это правильный инструмент для работы).
По моему опыту, вы можете очистить слабые ссылки с Sun JVM 5 с помощью System.gc (), что на 100% надежно для меня при первой проверке GC. Но они не гарантируют этого.