Как найти утечку классного загрузчика с помощью бесплатных инструментов?

Я изучаю утечку памяти в приложении Tomcat/ Spring/Hibernate, которое вызывает страшную ошибку "из-подмены" после нескольких повторений. Я загрузил бесплатную версию plumbr, которая подтверждает, что у меня есть утечка класса, но, к сожалению, я не могу позволить себе получить 499 долларов США, чтобы получить подробный отчет. Есть ли бесплатный инструмент, который может выполнить эквивалентный анализ и сказать мне, где его искать? Или какая-то другая общая причина таких утечек, которые я могу исследовать?

Шаги, которые я сделал до сих пор:

  • Убедитесь, что мой JDBC-драйвер не зарегистрирован при отключении контекста.
  • Вручную отключить драйвер MySQL. AbandonedConnectionCleanupThread (за утечка Tomcat Guice/JDBC)

Что еще может вызвать утечку?

Ответ 1

Вы можете использовать оценочную версию JProfiler для исследования утечки загрузчика класса. Перейдите в пробник загрузчика классов, выберите один из загрузчиков класса утечки и покажите их в хайпер-ходоке, где вы можете исследовать сильные ссылки на классы, загруженные загрузчиком классов.

Существует экран который показывает вам, как это сделать.

Отказ от ответственности: Моя компания разрабатывает JProfiler.

Ответ 2

Я обнаружил, что Eclipse Memory Analysis Tools работает достаточно хорошо. Я установил свой сервер для создания кучи кучи и использовал MAT (примерно следуя руководству здесь), чтобы найти все загрузчики классов. Кажется, что релевантно org.apache.catalina.loader.WebappClassLoader, и, перечисляя их корни GC, я легко мог узнать, что моя проблема вызвана java.util.logging.Level, на которую косвенно ссылались через org.jboss.logging.JDKLevel.

Теперь мне просто нужно выяснить, как предотвратить JBoss Logging, делая это...