Tomcat Müll sammeln Frequenz
Ich bin neu in Java, und habe gerade geerbt eine Tomcat-setup, also ich würde gerne einige Hinweise 🙂 ich habe mehr dazu Lesen Sie in der vergangenen Woche über die JVM-tuning und Müll sammeln algorithmen als ich möchte!
Mithilfe von Visual VM/GC-unsere Tomcat-Server sind vollständige GC-weniger als einmal pro Tag. Da die meisten Benutzer web-Sitzungen dauern weniger als eine hr, diese zu mee scheint sehr selten, und vermutlich gibt es eine Menge "Toten" Objekte in perm gen für eine lange Zeit? So tut dies nur bedeuten, dass wir über ausreichend RAM/heap-Speicher, und es einfach nicht brauchen, um zu sammeln, so dass es nicht?
Gegeben, würde es besser sein, die alte Generation kleiner, und die neue Generation größer, als die rate der Förderung ist sehr klein?
Ich Frage, weil es gibt Anzeichen, die anderswo in der OS, dass wir vielleicht Speicher drücke, aber die JVM/GC-logs scheint dem zu widersprechen, die OS.
Im Zusammenhang mit diesem -
Wir haben derzeit min-heap=max-heap=6Gb
. Wenn top
zeigt ein java-Prozess, der Größe von 7-8Gb, aber ein RSS von 5-6Gb, vermutlich dies bedeutet, dass 2 GB ausgelagert? In dem Fall, die es tut, zu sterben, wenn es voll GCs. So würde es besser sein, eine kleinere min-heap-Größe, die GCs öfter vor das OS tauscht es aus.
Ist es im Allgemeinen am besten zu verlassen, die JVM zu optimieren, statt immer obesesed mit Einstellungen alle Parameter manuell oder tun die meisten Menschen setzen die Parameter manuell?
- "Ist es in der Regel am besten, lassen Sie die JVM-tune selbst" - ist GC Leistung inakzeptabel Engpass?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Tomcat-version verwenden Sie?
Da ist ein Fehler in der memory-leak-prevention-gubbins, die Ursachen
full GCs auf die Stunde:
https://issues.apache.org/bugzilla/show_bug.cgi?id=53267
(beachten Sie, dass Fehler erwähnt seine auf tomcat7 aber 6 ist auch betroffen, Feste in 6.0.36)
Garbage collection ist ein trade-off zwischen Speicher-Allokation und performance. Stellen Sie sich vor Ihrem Dachboden. Wenn Sie halten, werfen die Dinge in ihm, irgendwann wird es voll, und Sie haben zu reinigen. Wenn Sie haben einen kleinen Dachboden, die Sie vielleicht füllen Sie es einmal im Monat, aber es dauert nur 20 Minuten ordentlich auf. Wenn du hast eine wirklich große Dachboden, es könnte Sie nehmen, ein Jahr zu füllen, sondern ein Wochenende zu säubern.
Das gleiche gilt für die JVM. Wenn Sie reservieren 6 GB, aber die konnte man wirklich mit 1,5 GB, dann haben Sie viel weniger häufigen Müll-Sammlungen, aber wenn Sie passieren, es könnte aufhören, die Welt für mehr als eine minute.
, Wie viel Speicher freigegeben wird, die durch die Wühl-Müll-Sammlungen?
Wenn die aufgeräumt (kopieren von Eden, Survivor) erholen sich die meisten der Speicher, dann hast du sehr viele kurzlebige Objekte. Wenn Sie erhöhen Sie die Größe der Neuen Generation, dann werden diese Müll-Sammlungen seltener geworden, aber Sie wird länger dauern. Idealerweise sollten Sie diese so schnell wie möglich, was bedeutet, halten Sie diesen Raum so klein, dass es kann kehren schnell, aber groß genug, dass kurzlebige Objekte nicht erhalten, gefördert, um die pragmatisierte generation. Würde ich nicht basteln mit der Größe der Neuen Generation, wenn ich waren sich sicher, das kurze Leben (d.h. Anfrage) Objekte werden verbeamtet, wenn Sie nicht sein sollte.
, Wie viel Speicher freigegeben wird, die durch Ihre vollständige garbage collection?
Wenn es Sie ein paar Tage zu füllen, 6 GB, gegeben, dass die Haufen sammelt Objekte aus jede Benutzer-session und request, den Sie je hatten, die seit der letzten vollständigen GC, würde ich vermuten, dass Sie die Befreiung ein gutes Stück von Ihrer heap mit der full GC. Wenn Sie es nicht sind, dann sollten Sie vielleicht prüfen, ob Sie einen Speicherverlust haben (vielleicht ein Schurken-cache). Wenn Sie sind zu befreien, die meisten von den heap mit der full GC, sollten Sie untersuchen, ob ein kleiner heap-Größe würde Sinn machen.
Einen kleineren Haufen, erhöht sich die Frequenz der full garbage collections, aber würde die Pausen deutlich kürzer. In einer web-Anwendung, lange stop-the-world-Pausen für full garbage collections inakzeptabel, wenn Sie passieren während einer Spitzenzeit.
Wenn, wie Sie angeben, die Java-heap potenziell getauscht durch das Betriebssystem, Sie sollten definitiv betrachten, schrumpft es. Aber ich würde nicht tamper mit der Neuen Generation sizing.
pmap
auf der java-Prozess), dass der Grund für unseren low-mem situation ist, dass gelegentlich die Java - process, nicht aber die Java - heap Spitzen von über 200Mb bis 3Gb! Brauchen, um herauszufinden, was die Ursache für das jetzt. Denke, ich werde schrumpfen, die max-heap-Größe als gut, so dass es GCs öfter, aber mit weniger Auswirkungen jedes mal.Aus meiner Erfahrung, denke ich, dass Aussagen
und
sind, widersprechen einander. In der Regel die Häufigkeit der GC steigt mit memory-churn, und die weniger Häufig dies geschieht, desto besser.
Erinnern, full GC bedeutet, dass alle Programm-Aktivitäten beendet - manchmal kann dies einige Minuten in Anspruch nehmen, vor allem für den großen Haufen!
Zum Beispiel, hier habe ich eine Reihe von live-Systemen mit ~1.4 K HTTP-Sitzungen, die jeder und jede box (
-Xmx=13g
) um 1-2 volle GCs pro Stunde. Idealerweise würden wir es gerne auch weniger Häufig, aber wegen der Art der app können wir nicht.Müssen Sie klären, was ist das echte problem, das Sie versuchen zu lösen, denn aus den Informationen, die Sie gegeben, ich sehe nicht alles, was verlangt Abstimmung.
top
) geht niedrig (<500 MB) und dann den server verlangsamt auf ein Schneckentempo. Derzeit gibt es einen Vorschlag, dass wir mehr Speicher hinzufügen, um unsere Server, um dieses Problem zu beheben. Für mich ist das mehr bezeichnend für ein Speicher-Leck irgendwo, so brauchen wir nicht mehr RAM. Ich war neugierig, ob die solche niedrigen Preise der full GCs bedeutete, dass Java viel RAM schon