Потенциальная утечка памяти 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 до повторное развертывание).
Общей тактикой является то, что вы выполняете горячее развертывание во время разработки (как правило, быстрее, чем холодное развертывание), и только холодное развертывание, когда утечка ресурсов начинает влиять на вашу производительность. Затем в производстве вы выполняете холодное развертывание при каждом развертывании. Учитывая количество кодов/библиотек, которые имеют этот тип утечки, попытка их устранения будет сложной ИМО.
Ответ 2
В соответствии с проблемой 630, она должна быть исправлена в следующей версии Guice (начиная с 11/2011), то есть когда Guava зависимость обновляется до r10 +.
Кажется, что исправление все еще не в соответствии с проблемой 288.
Ответ 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