5

私は 6.0.20 を使用しています。サーバー上で多数の Web アプリケーションを実行しており、約 3 日間、サーバーを再起動する必要があります。そうしないと、サーバーがクラッシュして応答しなくなります。

JVM には次の設定があります。

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20\logs

これにより、Java VisualVM を使用してロードした hprof ファイルが提供され、次のことが識別されます。

byte[] 37,206   Instances | Size 86,508,978
int[] 540,909   Instances | Size 55,130,332
char[] 357,847  Instances | Size 41,690,928

リストは続きますが、これらの問題の原因を特定するにはどうすればよいですか?

New Relic を使用して JVM を監視していますが、エラーが 1 つしか表示されないように見えますが、org.apache.catalina.connector という再発エラーです。ClientAbortException. ユーザー セッションが中止されたときに、作成されたデータベース接続または変数が閉じられず、孤立したままになる可能性はありますか?

各 Web アプリ全体で非常に頻繁に使用される関数がありますが、これがリークに関係しているかどうかは不明です。

public static String replaceCharacters(String s)
{
    s = s.replaceAll("  ", " ");
    s = s.replaceAll(" ", "_");
    s = s.replaceAll("\351", "e");
    s = s.replaceAll("/", "");
    s = s.replaceAll("--", "-");
    s = s.replaceAll("&", "and");
    s = s.replaceAll("&", "and");
    s = s.replaceAll("__", "_");
    s = s.replaceAll("\\(", "");
    s = s.replaceAll("\\)", "");
    s = s.replaceAll(",", "");
    s = s.replaceAll(":", "");
    s = s.replaceAll("\374", "u");
    s = s.replaceAll("-", "_");
    s = s.replaceAll("\\+", "and");
    s = s.replaceAll("\"", "");
    s = s.replaceAll("\\[", "");
    s = s.replaceAll("\\]", "");
    s = s.replaceAll("\\*", "");
    return s;
}

ユーザーのブラウザが閉じられた場合やユーザーがサイトを離れた場合など、ユーザー接続が中止されたときに、すべての変数、接続などが削除/解放される可能性はありますが、GC はそれを処理することになっていませんか?

以下は私のJVM設定です:

-Dcatalina.base=c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20
-Dcatalina.home=c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20
-Djava.endorsed.dirs=c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20\endorsed
-Djava.io.tmpdir=c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20\temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20\conf\logging.properties
-Dfile.encoding=UTF-8
-Dsun.jnu.encoding=UTF-8
-javaagent:c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20\newrelic\newrelic.jar
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20\logs
-Dcom.sun.management.jmxremote.port=8086
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false vfprintf
-Xms1024m
-Xmx1536m

何か不足していますか?サーバーには3GBのRAMがあります。

どんな助けでも大歓迎です:-)

4

3 に答える 3

2

すべてのプロジェクトを Tomcat 7.0.42 に移行したところ、エラーがなくなりました。Web サイトははるかに安定し、わずかに高速になりました。メモリの使用量が減り、CPU の使用率が大幅に改善されました。

于 2013-09-03T16:03:05.083 に答える
0

ローカル開発環境でサーバーを起動し、プロファイラーをアタッチします (キットが望ましい)。ヒープ ダンプを定期的に取得します。オブジェクト byte[] の増加が見られます。実際に、byte[]欠陥の特定に役立つこのツールを使用して、それらをアプリケーション クラスに接続し、それをリークさせることができます。コードで

于 2013-07-29T16:14:56.217 に答える