Guice + Tomcat потенциальная утечка памяти - PullRequest
12 голосов
/ 17 мая 2011

Я только что начал использовать Google Guice с моим веб-приложением Tomcat и заметил следующее в файле catalina.out всякий раз, когда файл WAR отключен:

May 16, 2011 5:37:24 PM org.apache.catalina.startup.HostConfig checkResources INFO: Undeploying context [/app]</p> <p>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.</p> <p>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 [com.google.inject.internal.InjectorImpl$1@10ace8d]) 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 сервлета и фильтр.

Спасибо!

Ответы [ 3 ]

5 голосов
/ 20 декабря 2011

В соответствии с проблемой Guice 630 она должна быть исправлена ​​в следующей версии Guice (по состоянию на 11/2011), т. Е. Когда зависимость Guava обновлена ​​ до r10 +.

Похоже, что исправление по-прежнему отсутствует, согласно Guice Issue 288 .

4 голосов
/ 17 мая 2011

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

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

0 голосов
/ 26 июня 2015

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

injector = null;
System.gc(); 

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

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

PS Tomcat 8, Java 8, Guice 3.0

...