1

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.WebappClassLoader6 138 個のロードされたクラスが 1 つ余分にあることがわかりました (合計で 2 つです)。

ヒープ スペースはほぼ一定のままで、MetaSpace の使用量だけが大幅に増加しました (クラス数とほぼ同じ割合で)。

アップデート

MAT を使用してさらに深く掘り下げると、クラスローダーを維持するインスタンスが常に 9 つあることに気付きました。これらはorg.codehaus.groovy.reflection.ClassInfo(各プリミティブ Java タイプ ラッパーおよび に対して 1 つVoid) のインスタンスです。これらの ClassInfo は によってのみ参照されるためjava.lang.ClassValue$EntryWeakReferenceこれらのインスタンスがガベージ コレクションされないことに本当に困惑しています。

誰かが同様の問題を抱えていましたか?このローダーがハングアップする原因は何ですか?

4

1 に答える 1

0

この問題は、https://issues.apache.org/jira/browse/GROOVY-7591に関連しています。

私はこの問題を完全には理解していませんが、簡単に説明しようと思います: (JDK のバグにより) を
使用するとClassValue、オブジェクトがガベージ コレクションされなくなります。Groovy 2.4.5 のコミットによりClassValue、JDK のバグが修正されるまで一時的に の使用が無効になりました。

Grails 2.5.1 はデフォルトで groovy 2.4.4 を使用するため、この問題を解決するために で置き換えBuildConfig.groovy、アプリケーションを再ビルドしました。

build 'org.codehaus.groovy:groovy-all:2.4.5'
compile 'org.codehaus.groovy:groovy-all:2.4.5'
于 2015-12-17T15:55:18.970 に答える