12

我刚刚开始在我的 Tomcat webapp 中使用 Google Guice,并且在取消部署 WAR 文件时注意到 catalina.out 文件中的以下内容:

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 [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 个 servlet 和一个过滤器。

谢谢!

4

3 回答 3

5

根据Guice 问题 630,它应该在下一个 Guice 版本(截至 11/2011)中修复,即当 Guava依赖项升级到 r10+ 时。

根据Guice 问题 288,该修复程序似乎仍未解决。

于 2011-12-20T10:08:58.633 回答
3

如果你在关闭 web 应用程序时得到这个,我不会太担心。应用程序上的这种类型的资源泄漏。关机很常见。当您经常进行热部署(即多次取消部署而不杀死 JVM)时,它们确实会成为一个问题,但在完成冷部署时它们不会有问题(在之前杀死 JVM 的同时完成取消部署/部署)重新部署)。

一种常见的策略是您在开发期间进行热部署(因为它们通常比冷部署更快),并且仅在资源泄漏开始影响您的性能时才进行冷部署。然后,在生产中,您对每次部署进行冷部署。鉴于存在此类泄漏的代码/库的数量,试图消除它们将是困难的 IMO。

于 2011-05-17T01:24:59.727 回答
0

这帮助我摆脱了“严重”日志条目com.google.inject.internal.InjectorImpl

injector = null;
System.gc(); 

其中注射器是Guice.createInjector(...modules...)

我承认,看起来我没有读到关于调用 System.gc() 的坏习惯,但这完全有道理,因为 Guice 在内部使用弱引用。

PS Tomcat 8、Java 8、Guice 3.0

于 2015-06-25T21:38:37.223 回答