Могу ли я остановить java.util.logging от утечки памяти? - PullRequest
2 голосов
/ 19 октября 2010

После остановки моего веб-приложения значительная часть PermGen не выпускается.Похоже, виновником является WebappClassLoader (в Tomcat, но также и в Jetty), который хранится в памяти по ссылкам из множества других объектов.На следующем рисунке показано, что объекты, которые ссылаются на WebappClassLoader, и вещи, которые к ним относятся, и т. Д.

alt text

Один из объектов clingy представляется экземпляром net.lag.logging.Level$INFO$, ссылка на которую хранится в статическом массиве known в java.util.logging.Level.

Похоже, что java.util.logging.Level сохраняет статическую ссылку на все свои экземпляры.Плохо, противно java.util.logging.Level!Могу ли я что-нибудь с этим сделать?Инфраструктура java.util.logging используется сторонней библиотекой, поэтому я не думаю, что у меня есть возможность ее не использовать.

1 Ответ

2 голосов
/ 19 октября 2010

Если не считать того, чтобы Sun исправила реализацию Level или изменила вашу библиотеку, чтобы избавиться от своего пользовательского уровня, единственный способ, о котором я могу думать, - это перемещение библиотеки из загрузчика классов веб-приложения в контейнер (общий или общий загрузчик классов) .

Если вы сделаете это, все еще будут пользовательские экземпляры уровня, но они больше не будут связаны с веб-приложением. Таким образом, если вы откажетесь от веб-приложения, оно продолжит перерабатывать те же уровни (не пропуская новые).

Конечно, это повлияет на загрузчик классов для библиотеки, и он может сломаться. Некоторые вещи должны быть в веб-приложении и не могут быть перемещены в контейнер. Даже если библиотека продолжит работать, она сама может сохранять аналогичные ссылки на другие части веб-приложения, что снова будет той же проблемой. Тем не менее, попробуйте.

...