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 🙂
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie eine dump-Analysator, der Ihnen erlaubt, zu sehen, was macht diese Objekte zu erreichen. Wählen Sie ein Objekt und sehen Sie, was andere Objekte verweisen ... und arbeiten Sie sich rückwärts durch die Ketten, bis Sie entweder zu finden, ein "GC root" oder oder anwendungsspezifische Klasse, die Sie erkennen.
Hier sind ein paar Verweise auf die Analyse der Speicherabbilder und Speicher-Profiler:
Sobald Sie festgestellt haben, dass Sie gegangen sind, die meisten der Weg, um die Identifizierung der Quelle Ihre Speicher-Leck.
Diese Funktion hat keinen direkten Einfluss auf das Leck. Es wird sicherlich nicht dazu führen, dass es. (Es konnte erzeugen eine Menge Müll String-Objekte ... aber das ist ein anderes Thema.)
Ich habe bemerkt, Aufgegeben-Verbindung cleanup threads, welche sich auf com.mysql.jdbc.NonRegisteringDriver$1.run(NonRegisteringDriver.java:93) in diesem Zusammenhang?
Glaube, ich stolperte über etwas hier, ich bin mit mysql-connector-java-5.1.21-bin.jar was glaub ich noch ein Problem, dass Tomcat nicht zur Veröffentlichung aufgegeben threads. Erwägen mysql-connector-java-5.1.25-bin.jar statt.
Das ist sicherlich eine plausible Erklärung. Probieren Sie es aus und sehen, wenn Sie das GLAS hilft. Es sollte ein "low-risk" zu ändern. Jedoch, da die Anzahl der undichten Objekte, vermute ich, dass das, was du gefunden hast ist nicht der einzige signifikante Leck.
Ich werde mit diesem zu starten, habe ich bemerkt, dass der Haufen ist zwischen 1GB und 1,5 GB aber der PermGen ist zwischen 55 MB zu 85MB, ich denke, das braucht einige Aufmerksamkeit zu, würde dies verursachen, dass der GC zu laufen, ziemlich viel ständig? Hast du eine Empfehlung für eine Größe für den PermGen?
InformationsquelleAutor Stephen C
Wanderte ich alle Projekte, die auf dem Tomcat-7.0.42 und meine Fehler sind verschwunden, unsere Internetseiten sind weit stabiler und etwas schneller, wir sind mit weniger Speicher und cpu-Auslastung ist weit besser.
InformationsquelleAutor iggyweb
Starten Sie den server im lokalen dev-Umgebung, schließen profiler (yourkit vorzugsweise), Nehmen Sie die heap-dump regelmäßig, Sie werden sehen, das Wachstum im Objekt-byte[] und man kann sogar schließen Sie die
byte[]
mit der Anwendung, Klasse lecken es mit diesem tool, das Ihnen helfen wird, idenfity defekt im codeUpdate, das Teil <!-->
Meinst du fix die ClientAbortException? Muss ich verlängern jede Funktion zu tun, oder kann es getan werden, durch die Deklaration einer Klasse in der server.xml Datei-handle durchtrennt Anfragen weltweit?
InformationsquelleAutor Jigar Joshi