Tomcat WebappClassloader не сборщик мусора - PullRequest
3 голосов
/ 08 августа 2011

Я пытаюсь отследить утечку памяти в моем веб-приложении, которая приводит к заполнению пространства PermGen и выбрасывает размер OutOfMemoryError: PermGen после нескольких перезагрузок. Теперь я знаю, что могу просто остановить / запустить весь экземпляр Tomcat, но я пытаюсь найти причину утечки памяти.

Я прочитал эту статью http://java.dzone.com/articles/memory-leak-protection-tomcat, которая указывает, что я должен убедиться, что после остановки моего приложения не должно быть никаких выдающихся ссылок на WebappClassLoader, что предотвратит его сборку мусора. Используя YourKit и Memory Analyzer, я обнаружил несколько случаев, когда это происходило в сторонних библиотеках, и исправил их.

Сейчас я нахожусь в точке, где оба инструмента сообщают, что «путей от корней GC к объекту (WebappClassloader)» нет, но WebappClassloader по-прежнему не является сборщиком мусора! Кто-нибудь сталкивался с чем-то подобным раньше?

Я использую Tomcat 6.0.32

1 Ответ

1 голос
/ 17 декабря 2012

Извините, я не решил эту проблему раньше ...

Я удалил все корни GC в WebappClassloader, но он просто не собирался мусором. Я пытался форсировать сборку мусора, но безрезультатно.

Проблема состояла в том, что вызов Runtime.getRuntime().gc(); не гарантирует, что все возможное будет собирать мусор - только то, что JVM приложит все усилия для этого.

После перезагрузки Tomcat еще пару раз в JVM стало не хватать пространства PermGen, WebappClassloader действительно был собран сборщиком мусора. Я предполагаю, что JVM не собирала его раньше, потому что в этом не было необходимости.

...