Ich habe eine Java-Anwendung mit hohen Datenmengen, die eine konsistente Belastung von 50000 ms / s verarbeitet. Es ist auf hohen Durchsatz mit den folgenden Einstellungen abgestimmt:
-Xmx3g -Xms3g -XX: Neue Größe = 2g -Xss128k -XX: SurvivorRatio = 6 -XX: ZielSurvivorRatio = 90 -XX: + UseParallelGC -XX: ParallelGCThreads = 12 -XX: + UseParallelOldGC -XX: + HeapDumpOnOutOfMemoryError
Ich stelle fest, dass die jungen GC-Zeiten von 50ms, wenn sie bis zum Ende des Tages auf 200ms ansteigt, stetig zunehmen, obwohl die Häufigkeit von GC-Läufen die gleiche bleibt.
Wenn ich den gleichen Lauf mit dem ParNewGC-Kollektor durchführe, werden die GC-Zeiten viel schneller hochgefahren. Hat jemand irgendwelche Gedanken zu diesem Problem?
Wenn Sie einen Speicherverlust oder einen speicherinternen Cache haben, der nach und nach immer mehr Speicher verwendet, würde dies dazu führen, dass der GC mehr Arbeit an der Verfolgung der erreichbaren Objekte ausführt.
Andere Möglichkeiten sind:
Sie haben ein Nicht-Heap-Speicherleck, und das führt zu einem zunehmenden Paging; d. h. Kopieren von physikalischen Speicherseiten auf Disc und zurück.
Einige externe Prozesse verbrauchen immer mehr Speicher, was zu einem erhöhten Paging führt.
Die Art der Objekte, die in der jungen Generation erzeugt werden, ändert sich mit der Zeit, so dass mehr Arbeit benötigt wird, um die erreichbaren Objekte zu verfolgen. Es kann einfach sein, dass ein größerer Teil von ihnen über die erste Sammlung hinauslebt.
Es kann eine Kombination mehrerer Faktoren sein:
Warum plotten Sie nicht die Anzahl der Objekte, Heap-Größe und GC-Zeit. (Verwenden eines Tools oder durch Abfragen von MBeans) Ein Diagramm sollte Ihnen den Trend zeigen; steigend, abnehmend oder linear, und hilft Ihnen festzustellen, ob ein Leck vorliegt. Falls möglich, sollten Sie auch einige Statistiken aus Ihrem Programm löschen, wie die Anzahl der verarbeiteten Nachrichten oder aktiven Sitzungen usw.
Ist das ein echtes Problem, da Ihre Nachrichten während der GC nicht verarbeitet werden? Probieren Sie die gleichzeitige Markierung und Sweep gc ...
%Vor%Tags und Links java garbage-collection jvm