При повторном развертывании приложения Tomcat создает новый загрузчик классов.Старый загрузчик классов должен быть подвергнут сборке мусора, в противном случае вы получите утечку памяти permgen.
Tomcat не может проверить, будет ли сборщик мусора работать, но он знает о нескольких типичных точках сбоев.Если загрузчик классов webapp устанавливает ThreadLocal
с экземпляром, класс которого был загружен самим загрузчиком классов webapp, поток сервлета содержит ссылку на этот экземпляр.Это означает, что загрузчик классов не будет собирать мусор.
Tomcat делает несколько таких обнаружений, см. здесь для получения дополнительной информации .Очистка локальных потоков затруднена, вам придется вызывать remove()
на ThreadLocal
в каждом из потоков, к которым был получен доступ.На практике это важно только во время разработки, когда вы повторно развертываете свое веб-приложение несколько раз.В производственной среде вы, вероятно, не выполняете повторное развертывание, поэтому это можно игнорировать.
Чтобы действительно выяснить, какие экземпляры определяют локальные потоки, вы должны использовать профилировщик.Например, обходчик кучи в JProfiler (отказ от ответственности: моя компания разрабатывает JProfiler) поможет вам найти эти локальные потоки.Выберите класс сообщаемого значения (com.sun.xml.bind.v2.runtime.property.SingleElementLeafProperty или com.sun.xml.bind.v2.ClassFactory) и отобразите накопленные входящие ссылки.Одним из них будет java.lang.ThreadLocal$ThreadLocalMap$Entry
.Выберите ссылочные объекты для этого входящего ссылочного типа и переключитесь в представление распределений.Вы увидите, где был размещен экземпляр.С этой информацией вы можете решить, можете ли вы что-то с этим сделать или нет.