permgen, но Java VisualVM говорит, что корень GC не найден

У меня есть очень простое веб-приложение типа «Hello world» (Spring 3.2.1, Hibernate 4.1.9) при остановке/перезапуске веб-приложения Tomcat 7.0.26

The following web applications were stopped (reloaded, undeployed), but their
classes from previous runs are still loaded in memory, thus causing a memory
leak (use a profiler to confirm):
/myapp

Я предпринял следующие шаги: Запустил JVisualVM Щелкните правой кнопкой мыши Tomcat и выберите «Дамп кучи». Щелкнул «Консоль OQL» в [дампе кучи]. Запустил этот запрос:

select x from org.apache.catalina.loader.WebappClassLoader x

Найдено 4 экземпляра:

org.apache.catalina.loader.WebappClassLoader

Выбран тот, чье поле «начало» было «ложным». Щелкните правой кнопкой мыши ссылку «эта» и нажал «Показать ближайший корень GC». Появится диалоговое окно с сообщением «Корень GC не найден».

Что мне не хватает? Любая помощь будет оценена. Спасибо.


person kmansoor    schedule 13.06.2013    source источник
comment
Есть новости по этому поводу? Я борюсь с этой проблемой. Есть чем поделиться?   -  person ggarciao    schedule 17.10.2013
comment
@ggarciao, передышки пока нет.   -  person kmansoor    schedule 22.10.2013
comment
Я создал поток Stackoverflow с моим случаем без корней gc"> stackoverflow.com/questions/19470328/   -  person ggarciao    schedule 22.10.2013
comment
Не стесняйтесь поделиться некоторыми знаниями, если вы найдете что-то, я сделаю то же самое   -  person ggarciao    schedule 22.10.2013


Ответы (2)


Со всеми учебниками в Интернете, показывающими точный процесс, который вы описываете,

  1. использовать визуалвм,
  2. найдите WebappClassLoader,
  3. ищите те, у которых «начало» равно false.
  4. Нажмите «Показать ближайший корневой каталог GC».

Это может сбить с толку, когда он возвращает «Нет GC Root».

Но это хорошо

В этих учебниках пропущен шаг, при просмотре списка WebappClassLoader щелкните ссылку «Вычислить сохраненный размер» с правой стороны.

visualVM показывает ссылку для вычисления сохраненных размеров

Через некоторое время (в зависимости от общего размера вашей кучи) это покажет что-то вроде следующего

visualVM показывает сохраненные размеры

Строки со значением Retained, равным 0, также являются загрузчиками классов, которые имеют статус false и не имеют корня GC.

Это просто означает, что они готовы к следующему запуску GC, который запустит JVM.

Резюме. Несмотря на то, что «обнаружение утечки tomcat» показывает утечку, если сохраненный размер равен 0, утечки нет, она просто ждет, пока GC удалит ее.

Примечание. Запуск GC в VisualVM не всегда удаляет его. Хотя он будет удален сборщиком мусора, запущенным самой JVM.

person muttonUp    schedule 05.10.2014

Попробуйте закрыть javaw.exe из процессов диспетчера задач.

person Melvins    schedule 06.05.2014
comment
Что, если окр. Tomcat развернут в Linux? Что делать, если на t/c развернуты другие приложения? Кроме того, закрытие может быть не вариантом. - person kmansoor; 06.05.2014