Потенциальная утечка памяти Guice + Tomcat

Я только начал использовать Google Guice с моим Tomcat webapp и заметил, что в файле catalina.out все файлы WAR нераспределены:

May 16, 2011 5:37:24 PM org.apache.catalina.startup.HostConfig checkResources INFO: Undeploying context [/app]

May 16, 2011 5:37:24 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads SEVERE: A web application appears to have started a thread named [com.google.inject.internal.util.$Finalizer] but has failed to stop it. This is very likely to create a memory leak.

May 16, 2011 5:37:24 PM org.apache.catalina.loader.WebappClassLoader clearThreadLocalMap SEVERE: A web application created a ThreadLocal with key of type [null] (value [[email protected]]) and a value of type [java.lang.Object[]] (value [[Ljava.lang.Object;@7e9bed]) but failed to remove it when the web application was stopped. To prevent a memory leak, the ThreadLocal has been forcibly removed.

Кто-нибудь знает, что вызывает это, или как я могу остановить его?

Я только следил за инструкциями отсюда http://code.google.com/docreader/#p=google-guice&s=google-guice&t=ServletModule

... и еще ничего не придумал. У меня всего 2 сервлета и фильтр.

Спасибо!

Ответ 1

Если вы получаете это, когда вы выключаете webapp, я бы не стал слишком беспокоиться. Этот тип утечки ресурсов в приложении. выключение является общим. Они становятся проблемой, когда вы часто делаете горячие разворачивания (т.е. Не разворачиваете много раз, не убивая JVM), но они не будут проблематичными, когда выполняется холодное развертывание (развёртывание/развертывание выполняется во время убийства JVM до повторное развертывание).

Общей тактикой является то, что вы выполняете горячее развертывание во время разработки (как правило, быстрее, чем холодное развертывание), и только холодное развертывание, когда утечка ресурсов начинает влиять на вашу производительность. Затем в производстве вы выполняете холодное развертывание при каждом развертывании. Учитывая количество кодов/библиотек, которые имеют этот тип утечки, попытка их устранения будет сложной ИМО.

Ответ 3

Это помогло мне избавиться от записи журнала "SEVERE" для com.google.inject.internal.InjectorImpl:

injector = null;
System.gc(); 

Если инжектор был результатом Guice.createInjector(...modules...)

Я признаю, что я не читал о дурной привычке звонить в System.gc(), но это совершенно разумно, поскольку Guice использует слабые ссылки внутри.

P.S. Tomcat 8, Java 8, Guice 3.0