Warum funktioniert mein tomcat application ' s memory-Nutzung weiter wachsen?
Meine Anwendung ausgeführt wird, auf Windows Server 2000. Der Speicherverbrauch wächst (von 145).
Ist das normal? Ich bin neu in Java. Die version ist Tomcat5.5.
InformationsquelleAutor user68461 | 2009-02-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn es immer nur wächst, dann ist das ein memory-leak. Aber wenn es wächst bis zu deinem max-heap, dann Tropfen, dann, das ist normal, garbage collection-Verhalten. Es gibt viele tools, die Sie verwenden können, um mehr zu erfahren. Eine der einfachsten ist die Verbindung mit JConsole (Teil des JDK) und beobachten Sie Ihre Haufen im Laufe der Zeit.
Können Sie auch einen Blick auf die garbage collection Informationen mit verschiedenen Schaltern und Parametern wie -verbose:gc, um mit zu beginnen.
Wenn Sie wollen, um zu diagnostizieren, memory leaks, es gibt eine Reihe von ausgezeichneten Werkzeugen zur Verfügung, darunter auch einige Kostenlose diejenigen, die Arbeit mit Eclipse, NetBeans, IntelliJ, etc.
InformationsquelleAutor Alex Miller
Standard-Verhalten der Sonne "server" HotSpot ist, um zu vergrößern die Haufen eher als clearing -
SoftReference
s (für caches). Die Vorgabe war das halten Sie für eine Sekunde für jedes MB maximale heap-Größe zur Verfügung. Also erwartet, dass der heap zu wachsen, um die maximale Größe. Wenn Sie tatsächlich der Arbeitsspeicher mitOutOfMemoryException
oder die performance schlecht wird (wegen der übermäßigen GC oder kleine caches), dann brauchen Sie, um Speicherverluste zu suchen.Auch Tomcat Server leiden Häufig unter Speicherlecks nach dem Neuladen von Anwendungen. Zum Beispiel, Tomcat Aktien Fäden zwischen alle Anwendungen, die oft bewirkt, dass Sonne
ThreadLocal
Umsetzung zu Unrecht bewahren Werte.Passiert eine Menge mit bestimmten Rahmenbedingungen, dumme Classloadern...
Ich werde Bearbeiten, qualifizieren Sie sich meine Aussage etwas. Die Sonne ThreadLocal-Umsetzung, zum Beispiel, führt in der Regel zu Undichtigkeiten wie Tomcat nicht verwerfen threads. Ich weiß nicht, was crazybob ' s Harmony Umsetzung tut.
InformationsquelleAutor Tom Hawtin - tackline
IMO Tom Hawtin ' s Antwort ist die beste. Es wächst, bis es auf max ist, dann läuft der GC. In einer server-Umgebung, das macht Sinn: Sie wollen die beste Leistung, nicht am besten den Speicherverbrauch. Sie vorab berechnen, wie viel Speicher insgesamt, dann geben jeder app maximal und dann passt alles und hat die beste Leistung. Dieses Verhalten kann optimiert werden.
Verwenden jconsole, um zu schauen, wie viel tatsächlich verwendet wird. Do GC und sehen, was es nach unten geht. Sollte diese Zahl nicht im Laufe der Zeit wachsen oder Sie haben ein memory leak. Verwenden visualvm zu Debuggen, die einen Speicherverlust.
Jedes mal, wenn Sie und laden Sie eine Anwendung, verwendet es zusätzliche PermGen-Speicher, die nicht zurückgefordert werden (in der Sun-JVM, andere wie JRockit haben dieses problem nicht). In der Produktion sollte man sich nicht Neuladen der app. Starten Sie Tomcat neu, jedes mal. Wenn Sie wirklich wollen, es zu tun zu halten, dann erhöhen Sie die max. - Speicher und erhöhen auch den Max Perm Gen Speicher mit dem flag -XX:MaxPermSize=256m
InformationsquelleAutor Sarel Botha
Mit dem Programm Lambda-Sonde können Sie leicht betrachten Sie die Speicher-Nutzung in Tomcat. (option System - Informationen- Speicher-Auslastung).
Sie sehen in einem Diagramm Survivor Space Perm Gen Pragmatisierte Gen Eden Space Code Cache
Nur einsetzen, diese warfile zu tomcat und legen Sie die Start-option
-Dcom.Sonne.management.jmxremote, um das Java startup.
Jetzt können Sie sehen, welcher Teil des Speichers wächst.
InformationsquelleAutor Edwin
Dies ist nicht normal, und es ist wohl bezeichnend für eine Speicherverlust.
Sollten Sie versuchen, mit einem memory-profiler, um zu sehen, wo Ihre Anwendung ist undicht.
Im Allgemeinen, sollten Sie sich für loops oder wiederholte Operationen, in denen Objekte erzeugt, aber nicht entsorgt richtig.
Kontinuierliches Wachstum ist definitiv /nicht/ normal.
Ich denke, es hängt davon ab, ob es ein kontinuierliches Wachstum ohne Grenzen oder nicht
en.wiktionary.org/wiki/continual
InformationsquelleAutor GEOCHET
Haben Sie möglicherweise einen Speicherverlust. Ich würde zuerst eine Verbindung jconsole, um Ihre Anwendung zu ermitteln, ob es permgen space oder einfach nur heap-Speicher und dann gehen Sie, um herauszufinden, wo das Leck ist. Können Sie uns einige weitere Informationen? Was ist Los in Ihrer Anwendung als auch der Arbeitsspeicher wächst?
Wenn Sie sind eine relativ neue Diagnose dieser Art von problem, würde ich empfehlen, jprofiler. Sie können laden Sie eine voll funktionsfähige Testversion, und nehmen Speicher-snapshots, um zu sehen, welche Objekte sich im Speicher befinden. Sie können diese Informationen verwenden, um herauszufinden, welche Objekte die Quelle des Lecks.
InformationsquelleAutor neesh