[英]Tomcat Fix Memory Leak?
我正在使用6.0.20我在服務器上運行了許多Web應用程序,隨着時間的推移,大約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內存。
任何幫助將非常感激 :-)
...但我如何確定導致這些問題的原因?
您需要使用轉儲分析器,它允許您查看使這些對象可訪問的內容。 選擇一個對象,並查看其他對象或對象引用它...然后通過鏈向后工作,直到找到“GC根”或您識別的某個特定於應用程序的類。
以下是分析內存快照和內存分析器的幾個參考:
一旦確定了這一點,您就已經完成了識別存儲泄漏源的大部分方法。
該功能與泄漏沒有直接關系。 它肯定不會導致它。 (它可能會生成大量垃圾String對象......但這是一個不同的問題。)
我將所有項目遷移到Tomcat 7.0.42並且我的錯誤消失了,我們的網站更穩定,速度更快,我們使用更少的內存和cpu使用情況要好得多。
在本地開發環境中啟動服務器,附加分析器(最好是你的套件),定期進行堆轉儲,你會看到對象byte []的增長,你可以實際將那些byte[]
與你的應用程序類連接,使用這個工具泄漏它你在代碼中存在缺陷
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.