# Tomcat total memory



## carina (5. Mrz 2009)

Hallo,
ich habe ein Speicherproblem mit Tomcat:
Je länger er ohne restart läuft, umso langsamer wird er. Das liegt (denke ich) daran, dass der "Total Memory" ständig wächst, bis schließlich der "Max Memory" erreicht ist.
Ist das normal ? 
Zuerst dachte ich, dass ich ein Memory Leak habe, aber sogar wenn ich den Server ein paar Tage auf Anschlag laufen lasse, bekomme ich kein OutOfMemory.
Der "Free memory" wandert ständig zw. 15 und 300MB hin und her.
Ich weiss jetzt nicht, wie ich das deuten soll. Hat meine Applikation genügend Speicher oder nicht ? Was genau bedeutet Total Memory und warum geht er nicht mehr runter ?

Hat da jemand Erfahrung ?

Danke Carina


----------



## JanHH (5. Mrz 2009)

Naja, vielleicht ist Deine Anwendung einfach irgendwie ungünstig programmiert, was die Speicher-ausnutzung angeht?


----------



## carina (5. Mrz 2009)

was meinst du damit ?


----------



## maki (5. Mrz 2009)

http://www.lambdaprobe.org/d/index.htm

oder

https://visualvm.dev.java.net/


----------



## carina (5. Mrz 2009)

das heisst, du meinst das Problem liegt in meinem Code, oder ? Warum bekomme ich dann keine OutOfMemory Exception ?


----------



## JanHH (5. Mrz 2009)

Bist Du sicher dass Du keine bekommst? Mal in die Logfiles geguckt?


----------



## carina (7. Mrz 2009)

sicher


----------



## Noctarius (7. Mrz 2009)

> Der "Free memory" wandert ständig zw. 15 und 300MB hin und her.
> Ich weiss jetzt nicht, wie ich das deuten soll. Hat meine Applikation genügend Speicher oder nicht ? Was genau bedeutet Total Memory und warum geht er nicht mehr runter ?



Java fängt mit einem Speicherwert -Xms an, ist dieser erreicht wird 1. eine GarbageCollection angeschmissen und zweitens mehr Speicher angewiesen, bis der Wert in -Xmx erreicht ist.

Da die VM aber Speicher nicht wieder deallociert wächst der Verbrauch der VM nur, sinkt aber nicht wirklich wieder.

Heißt bei -Xms=15M und -Xmx=200M:
VM Start -> 15MB
Programm kommt ans Limit von 15MB -> GarbageCollection + 15MB+X (X nehm ich hier mal als 5MB an)
After GarbageCollection -> 7MB (weil nicht mehr freigeschaufelt werden konnte) - Neues Limit 20MB
Programm kommt ans Limit von 20MB -> GarbageCollection + 20MB+X
usw usw usw...
Programm kommt ans Limit von 200MB -> GarbageCollection + 200MB - höher geht's nicht wegen Xmx=200M

Sollte an dieser Stelle noch mal Speicher frei werden beim GC arbeitet die VM weiter, werden keine Objekte mehr entladen gibt es eine OutOfMemoryException, weil kein freier Speicher mehr zur Verfügung steht.


----------



## carina (8. Mrz 2009)

ah,  wenn ich dich richtig verstehe heiss das :
Es ist alles ok, liegt kein Programmierfehler vor, aber etwas mehr Speicher würde nicht schaden. 
Oder ?


----------



## Noctarius (8. Mrz 2009)

Nope ist Java Standardverhalten, dass immer nur Speicher hinzu geholt wird bis max erreicht ist aber nur VM intern (also nicht zum Betriebssystem hin) freigegeben wird.

Java geht davon aus, dass wenn dein Programm einmal soviel Speicher gebraucht hat (und es eben kein Programmierfehler war) der Zustand noch mal eintritt 

Deswegen kann man auch, wenn ein Programm definitiv ne Menge Speicher braucht, -Xms auch ruhig auf einen passenden Startwert setzen, da übermäßige GC-Durchläufe beim Starten eines Programmes eine Menge Zeit kosten können.

Wir starten in der Firma unseren Tomcat z.B. direkt mit -Xms512M


----------



## carina (8. Mrz 2009)

danke, hast mir sehr geholfen


----------



## Noctarius (8. Mrz 2009)

Keine Ursache


----------

