3

最大 JVM メモリを 800MB に設定して、組み込みの jetty を Java アプリケーション サーバーとして使用しています。Web アーカイブを展開および展開解除する方法を作成しました。基本的な Hello World アプリケーションで war を展開するたびに、組み込みアプリケーション サーバーは約 200MB の追加メモリを使用し、4 つ目の Web アプリケーションを追加した後にメモリ不足を引き起こします。これは、組み込みの Jetty をアプリケーション サーバーとして使用する場合に想定される動作ですか?

@ManagedOperation
public boolean deployWebApp(String context, String pathToWar){
    boolean success = false;
    WebAppContext webctx = null;
    try{
        webctx = addWebApp(context, pathToWar);
        webctx.getTempDirectory();
        webctx.start();
        success = webctx.isRunning();
    } catch (Exception e) {
        e.printStackTrace();
        logger.log(Level.SEVERE, "Failed to startup webapp with webappcontext: ", webapps.get(context).getContextPath());           
    }
    return success;     
}
4

3 に答える 3

1

いいえ、組み込みの Jetty を使用していますが、そのような量のメモリは使用しません。

最善の方法は、ヒープ ダンプを作成してから、Eclipse メモリ アナライザーなどのツールを使用してヒープを分析し、大量のメモリを消費している Web アプリケーションが何であるかを確認することです。

于 2012-08-08T13:05:41.377 に答える
0

jconsole をいじって、contexthandlercollection の各ハンドラーを調べたところ、デプロイされていない Web アプリケーションがセキュリティ ハンドラーとセッション ハンドラーを削除していないことがわかりました。

これらの各ハンドラーをプログラムで削除したところ、perm gen メモリが減少していることがわかります。

this.getSessionHandler().stop();
this.getSessionHandler().destroy();
this.getSecurityHandler().stop();
this.getSecurityHandler().destroy();
于 2013-02-15T10:01:09.333 に答える
0

アンデプロイ/デプロイのメモリ リークは、さまざまな既知の JRE ClassLoader ピン留めの問題に関連している可能性があります。

私たちは最近 (過去 2 日間で!)、WebAppClassLoader が ClassLoader への参照をリークしない方法で動作できるように、サーバー側のクラスローダーにこのピニングの予防的な防止策をいくつか追加しました。

参照: http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/jetty-util/src/main/java/org/eclipse/jetty/util/preventers

これらはすべて Server.addBean(Object) メソッドを介してサーバーに追加されます。

組み込みサーバーでこれらを使用すると、運が良いかもしれません。

于 2012-08-11T04:12:36.960 に答える