gpt4 book ai didi

java - Tomcat 修复内存泄漏?

转载 作者:搜寻专家 更新时间:2023-11-01 02:47:52 26 4
gpt4 key购买 nike

我使用的是 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。客户端中止异常。是否有可能当用户 session 中止时,创建的任何数据库连接或变量都没有关闭,因此成为孤立的?

有一个功能在每个网络应用程序中都被大量使用,不确定这是否与泄漏有关:

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 内存。

任何帮助将不胜感激:-)

最佳答案

... but how do I determine what is causing these issues?

您需要使用转储分析器来查看使这些对象可访问的原因。选择一个对象,看看其他一个或多个对象引用了它……然后通过链向后工作,直到找到“GC 根”或您识别的某个特定于应用程序的类。

这里有一些关于分析内存快照和内存分析器的引用资料:

一旦确定了这一点,您就已经完成了确定存储泄漏源的大部分工作。


该函数与泄漏没有直接关系。它肯定不会引起它。 (它可能会生成大量垃圾 String 对象......但这是一个不同的问题。)

关于java - Tomcat 修复内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17928895/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com