Warum wächst die Speichernutzung meiner Tomcat-Anwendung weiter?

Meine Anwendung wird unter Windows Server 2000 ausgeführt. Die Speichernutzung wächst weiter (ab 145m).

Ist das normal? Ich bin neu in Java. Die Version ist Tomcat5.5.

Antwort auf "Warum wächst die Speichernutzung meiner Tomcat-Anwendung weiter? " 6 von antworten

Dies ist nicht normal und ist wahrscheinlich ein Hinweis auf eine memory leak. .

Sie sollten versuchen, ein memory profiler to see where your application is leaking. zu verwenden, um zu sehen, wo Ihre Anwendung undicht ist.

Im Allgemeinen sollten Sie nach Schleifen oder wiederholten Operationen suchen, bei denen Objekte erstellt werden, aber nicht disposed of correctly. richtig.

Möglicherweise liegt ein Speicherleck vor. Ich würde zuerst jconsole mit Ihrer Anwendung verbinden, um festzustellen, ob es permgen Speicherplatz oder nur Heap-Speicher ist und dann gehen Sie fort, um herauszufinden, wo das Leck ist. Können Sie uns weitere Informationen geben? Was passiert in Ihrer Anwendung, wenn der Speicher wächst?

Wenn Sie relativ neu bei der Diagnose dieser Art von Problem sind, würde ich jprofiler empfehlen. Sie können eine voll funktionsfähige Testversion herunterladen und Speichermomentaufnahmen erstellen, um zu sehen, welche Objekte sich im Arbeitsspeicher befinden. Anhand dieser Informationen können Sie herausfinden, welche Objekte die Quelle des Lecks sind.

Wenn es nur wächst, dann ist das ein Speicherleck. Aber wenn es bis zu Ihrem maximalen Heap wächst, dann fällt, dann ist das normales Garbage Collection-Verhalten. Es gibt viele Tools, die Sie verwenden können, um mehr zu erfahren. Eine der einfachsten ist es, sich mit JConsole (Teil des JDK) zu verbinden und Ihren Heap im Laufe der Zeit zu beobachten.

Sie können sich auch Garbage Collection-Informationen mit verschiedenen Schaltern und Parametern wie -verbose:gc ansehen.

Wenn Sie Speicherverluste diagnostizieren möchten, gibt es eine Reihe von hervorragenden Tools zur Verfügung, darunter mehrere kostenlose, die mit Eclipse, NetBeans, IntelliJ, etc.

arbeiten

Das Standardverhalten von Sun "server" HotSpot besteht darin, den Heap zu vergrößern, anstatt SoftReferences (used for caches). The default was to keep them for one second for every megabyte of maximum heap size available. So, expect the heap to grow to the maximum size. If you do actually run out of memory with s (für Caches verwendet) zu löschen. Standardmäßig blieb es für eine Sekunde für jedes Megabyte der maximalen Heapgröße verfügbar. Erwarten Sie also, dass der Heap auf die maximale Größe anwächst. Wenn Ihnen tatsächlich der Speicher mit OutOfMemoryException or performance becomes poor (due to excessive GC or small caches), then you need to look for memory leaks. nicht mehr zur Verfügung steht oder die Leistung schlecht wird (aufgrund übermäßiger GC- oder kleiner Caches), müssen Sie nach Speicherverlusten suchen.

Auch Tomcat-Server leiden oft unter Speicherverlusten nach dem erneuten Laden von Anwendungen. Beispielsweise teilt Tomcat Threads zwischen allen Anwendungen, was häufig dazu führt, dass Die ThreadLocal implementation to improperly retain values.-Implementierung von Sun Werte nicht ordnungsgemäß aufbehält.

IMO Tom Hawtins Antwort ist die beste. Es wächst, bis es das Maximum trifft, dann läuft GC. In einer Serverumgebung ist dies sinnvoll: Sie wollen die beste Leistung und nicht die beste Speichernutzung. Sie berechnen die Gesamtmenge an Speicher vor, geben dann jeder App ein Maximum und dann passt alles und hat die beste Leistung. Dieses Verhalten kann optimiert werden.

Verwenden Sie jconsole, um zu sehen, wie viel wirklich verwendet wird. Tun Sie GC und beobachten Sie, worauf es ankommt. Diese Zahl sollte im Laufe der Zeit nicht wachsen, oder Sie haben ein Speicherleck. Verwenden Sie visualvm, um einen Speicherverlust zu debuggen.

Jedes Mal, wenn Sie eine Anwendung neu laden, verwendet sie zusätzlichen Perm Gen-Speicher, der nicht zurückgefordert werden kann (in Sun JVM haben andere wie JRockit dieses Problem nicht). In der Produktion sollten Sie die App nicht neu laden. Starten Sie Tomcat jedes Mal neu. Wenn Sie es wirklich weitermachen wollen, dann können Sie den maximalen Speicher erhöhen und auch den Max Perm Gen Speicher mit dem Flag -XX:MaxPermSize=256m

erhöhen.
Sie können in einem Diagramm Survivor Space Perm Gen Tenured Gen Eden Space Code Cache

Sehen Sie Einfach diese Warfile zu tomcat und legen Sie die Startoption

Mit dem Programm Lambda Probe you can easily look at the memory usage in Tomcat. (option System information - Memory utilization). You can see in a graph Survivor Space Perm Gen Tenured Gen Eden Space Code Cache können Sie sich ganz einfach die Speichernutzung in Tomcat ansehen. (Option Systeminformationen - Speicherauslastung). -Dcom.sun.management.jmxremote zum Java-Startup.

Jetzt können Sie sehen, welcher Teil des Gedächtnisses wächst.