Слабая ссылка и утечки памяти - PullRequest
1 голос
/ 30 октября 2011

Я профилирую свое приложение с помощью VisualVM и вижу, что размер кучи увеличился примерно на 7 МБ примерно за 3 дня.Когда я использую сэмплер памяти, я также вижу, что java.lang.ref.WeakReference входит в пятерку лучших по количеству экземпляров.Число WeakReference увеличивается, и GC практически не имеет эффекта.

Есть идеи?

Ответы [ 3 ]

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

У вас нет утечки памяти.

Java GC запускается только тогда, когда куча заполнена (на самом деле это немного сложнее, так как сама куча делится на поколения, но в любом случае), поэтому, если вы не заполняете кучу (что очень маловероятно, так как 7Mb слишком мало памяти для любой кучи) вы не можете сказать, есть ли у вас утечка или нет.

WeakReferences - это небольшие оболочки, которые на самом деле помогают предотвратить утечки памяти, помечая объект, на который они ссылаются, как элегантный для GC. Я предполагаю, что вы включаете какую-то библиотеку кеша, которая создает кучу таких, и, поскольку в куче все еще достаточно места, нет необходимости собирать их мусором.

Опять же, если вы не видите, что сборщик мусора работает часто, а размер кучи все равно увеличивается, я бы не стал беспокоиться о проблемах с памятью.

Вот отличная статья по этому вопросу

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

VisualVM использует ресурсы в системе. Это одна из его слабостей по сравнению с коммерческими профилировщиками. Поскольку такие небольшие различия не могут быть легко замечены с VisualVM, потому что он создает свой собственный шум.

Допустим, у вас утечка 7 МБ за 3 дня (в чем я сомневаюсь). Сколько раз стоит потратить, чтобы это исправить? 16 ГБ памяти стоит около 100 долларов, поэтому 7 МБ стоит около 5 центов, или около 3 секунд вашего времени. Я бы беспокоился об этом больше, если бы он был больше, гораздо больше.

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

Слабые ссылки являются одними из первых, которые собираются в случае, если JVM запускает полный сборщик мусора, однако они не должны быть сильно / мягко доступны (никакая сильная / мягкая ссылка не должна содержать ссылку на нее). Я обычно меньше всего беспокоюсь о WeakReferences, они получают GC-ed в конце концов. Вы должны проверить свои циклы GC (jstat) и посмотреть, не претендует ли даже GC на эти ссылки. Также, пожалуйста, не экстраполируйте утечку, ваше приложение не обязательно увеличит потребление памяти в ближайшие несколько дней. Я бы предложил провести длительный (48 часов?) Тест производительности со значительной нагрузкой в ​​непроизводственной среде и посмотреть, не возникнут ли у вас проблемы с памятью.

...