我正在使用6.0.20版本。我有许多网络应用程序在服务器上运行,随着时间的推移,大约3天左右,服务器需要重新启动,否则服务器会崩溃并变得无响应。
我对JVM的设置如下:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20\logs
这为我提供了一个hprof文件,我使用Java VisualVM加载它并识别出以下内容:
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,只有一个错误似乎一直出现,也就是 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内存。
任何帮助都将不胜感激 :-)
ThreadLocal
和不良使用static
缓存引起的。你的应用程序是在负载下还是空闲状态下? - Boris the Spiderpublic static String removeLineBreaks(String s) public static String replace(String s, String s1, String s2) public static String replaceCharacters(String s)
- iggyweb