私は 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があります。
どんな助けでも大歓迎です:-)