12

TomcatWebアプリでGoogleGuiceを使い始めたばかりですが、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つのサーブレットと1つのフィルタがあります。

ありがとう!

4

3 に答える 3

5

Guiceの問題630によると、次のGuiceバージョン(2011年11月現在)で修正される必要があります。つまり、Guavaの依存関係がr10+にアップグレードされた場合です。

Guiceの問題288によると、修正はまだ行われていないようです。

于 2011-12-20T10:08:58.633 に答える
3

Webアプリをシャットダウンしたときにこれが発生する場合は、それほど心配する必要はありません。このタイプのアプリのリソースリーク。シャットダウンは一般的です。ホットデプロイを頻繁に行う場合(つまり、JVMを強制終了せずに何度もアンデプロイする場合)は問題になりますが、コールドデプロイを実行する場合(JVMを強制終了する前にアンデプロイ/デプロイを実行する場合)は問題になりません。再デプロイ)。

一般的な戦術は、開発中にホットデプロイを実行し(通常、コールドデプロイよりも高速であるため)、リソースリークがパフォーマンスに影響を及ぼし始めたときにのみコールドデプロイを実行することです。次に、本番環境では、すべてのデプロイでコールドデプロイを実行します。このタイプのリークがあるコード/ライブラリの数を考えると、それらを排除しようとするのは難しいIMOです。

于 2011-05-17T01:24:59.727 に答える
0

これは、次の「SEVERE」ログエントリを取り除くのに役立ちました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 に答える