Tomcat Fix Memory Leak?

Ich bin mit 6.0.20 ich habe eine Reihe von web-apps, die auf dem server ausgeführt, im Laufe der Zeit, etwa 3 Tage und der server braucht ein Neustart sonst der server abstürzt und nicht mehr reagiert.

Habe ich die folgenden Einstellungen für die JVM:

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=c:\tomcat\Websites\private\mydomain\apache-tomcat-6.0.20\logs

Diese bietet mir die hprof-Datei, die ich geladen haben, die mit Java VisualVM identifiziert, die die folgenden:

byte[] 37,206   Instances | Size 86,508,978
int[] 540,909   Instances | Size 55,130,332
char[] 357,847  Instances | Size 41,690,928

Die Liste geht weiter, aber wie kann ich bestimmen, was die Ursache für diese Probleme?

Ich bin mit New Relic zur überwachung der JVM und der einzige Fehler scheint zu erscheinen, aber es ist eine wiederkehrende, org.apache.catalina.- Anschluss. ClientAbortException. Ist es möglich, dass, wenn ein Benutzer die Sitzung abgebrochen, alle Datenbank-verbindungen oder Variablen erstellt werden, nicht geschlossen und sind daher verwaist?

Gibt es eine Funktion, die verwendet wird, relativ stark in den einzelnen web-app, nicht sicher, ob dies hat keine Auswirkungen auf das Leck:

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;
}

Ist es möglich, dass, wenn ein Benutzer die Verbindung abgebrochen, wie ein Benutzer-browser geschlossen wird oder der Benutzer hat die site verlassen, dass alle Variablen, verbindungen, etc... gelöscht/freigegeben, aber nicht GC soll behandelt werden?

Unten sind meine JVM-Einstellungen:

-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

Bin ich etwas fehlt? Der server hat 3GB ram.

Jede Hilfe wäre sehr geschätzt 🙂

Keine einfache Möglichkeit wirklich. Sie können versuchen, eine dump und dann rief der garbage collector dann tun eine andere dump und sehen, was hängen herum. Klassische memory-Lecks, verursacht durch ThreadLocal und schlechten Gebrauch von static caches. Sind Ihre apps unter Last oder im Leerlauf?
Dies ist eine live-Produktionsumgebung, die jeder app verwendet eine Klasse, die hat die folgenden Funktionen: public static String removeLineBreaks(String s) public static String replace(String s, String s1, String s2) public static String replaceCharacters(String s)
Weitere Untersuchungen mit dem Eclipse Memory Analyzer, die beiden größten Probleme sind org.apache.catalina.loader.WebappClassLoader und org.apache.die Benennung.Ressourcen.ResourceCache, wie ich bin mit Tomcat 6.0.20, ich glaube WebappClassLoader ist ein Problem, das nicht gelöst, bis Tomcat 7.
Wenn Sie nicht bereitstellen/deinstallation von Lasten dann mal der ClassLoader ist nicht Ihr problem. Dieses ist groß, weil es Referenzen alle Ihre Klassen. Wenn Sie eine Bereitstellung/deinstallation von, dann haben Sie möglicherweise ein ClassLoader Leck; bad neu ist, dass diese sind unglaublich schwer aufzuspüren.
Nach der änderung der JDBC-Treiber, die Dinge gesetzt haben, aufgefallen, dass Klassen entladen, total entladen hat sich auf 117 von 68 früher an diesem morgen. Heap noch schwankend zwischen 300 und 600 MB ca. 8 mal in der minute. 23 8 websites und web-apps, die ich vermute, dass ist nicht allzu schlimm.

InformationsquelleAutor iggyweb | 2013-07-29

Schreibe einen Kommentar