Tomcat 8 で単純な Grails アプリケーションをホット再デプロイする際に問題があります。
私のセットアップは次のとおりです。
- Grails 2.5.1 で作成されたばかりの真新しいアプリケーション
create-app
- Tomcat 8.0.28 (64 ビット Linux バイナリ バージョン)
- Java 1.8.0_65-b17 HotSpot サーバー VM
Tomcatもまったく新しいインストールであり、2つのことだけを変更しました(本番環境で使用したいため):
サーバー.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" undeployOldVersions="true">
context.xml
<Context antiResourceLocking="true">
Tomcat サーバーを再起動しました。JVisualVM によると、2398 個のクラスがロードされていました。によって生成された war ファイルをコピーしgrails prod war
、デプロイが完了するのを待った後、10,022 個のクラスがロードされました。戦争を再度コピーした後、再展開がトリガーされ、16 300 クラスがありました。
最初のデプロイの後にヒープ ダンプを作成し、2 番目に eclipse MAT を使用してクラスローダーを分析したところ、org.apache.catalina.loader.WebappClassLoader
6 138 個のロードされたクラスが 1 つ余分にあることがわかりました (合計で 2 つです)。
ヒープ スペースはほぼ一定のままで、MetaSpace の使用量だけが大幅に増加しました (クラス数とほぼ同じ割合で)。
アップデート
MAT を使用してさらに深く掘り下げると、クラスローダーを維持するインスタンスが常に 9 つあることに気付きました。これらはorg.codehaus.groovy.reflection.ClassInfo
(各プリミティブ Java タイプ ラッパーおよび に対して 1 つVoid
) のインスタンスです。これらの ClassInfo は によってのみ参照されるためjava.lang.ClassValue$Entry
、WeakReference
これらのインスタンスがガベージ コレクションされないことに本当に困惑しています。
誰かが同様の問題を抱えていましたか?このローダーがハングアップする原因は何ですか?