Warum steigen die GC-Zeiten bei einer Java-App mit langer Laufzeit und hohem Durchsatz kontinuierlich an?

8

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?

    
Java IsSlow 09.09.2010, 08:55
quelle

2 Antworten

3

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.

Stephen C 09.09.2010 09:39
quelle
2

Es kann eine Kombination mehrerer Faktoren sein:

  • Ein echtes Speicherleck. (Objekte werden immer noch versehentlich referenziert)
  • Weitere Objekte oder eine andere Verteilung der Objekte zwischen den GC-Pools.
  • Der Haufen ist größer. Stellen Sie die GC-Zeit und die Größe des Heapspeichers dar.
  • Speicherfragmentierung. Auf OS-Ebene und / oder dem Java-Heap, abhängig von jvm.

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%     
KarlP 09.09.2010 10:52
quelle

Tags und Links