簡體   English   中英

Tomcat修復內存泄漏?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM