2013-04-01 5 views
5

Ich habe eine Java-Anwendung, die so viel CPU wie möglich und damit viel Speicher (bis zu 80 GB) verwendet.Gib GC mehr CPU-Zeit in Java?

Ich optimiere den GC für diese App und ich möchte der JVM mitteilen, dass sie einen bestimmten Prozentsatz der Zeit (60%) für den GC verwenden soll, da ansonsten die Maschine nicht mehr verarbeitet und zugewiesen wird Erinnerung.

wollte ich bestätigen, dass die -XX:CMSIncrementalDutyCycle=60 Parameter die Sache ist, ich suche und ob es noch andere Parameter ist mehr Kraft auf die GC zu geben

Dank (Ich habe bereits den CMSIncrementalPacing und CMSIncrementalDutyCycleMin gesehen) ein Bündel!

+1

"Ich wollte bestätigen, dass der Parameter XX: CMSIncrementalDutyCycle = 60 das ist, wonach ich suche" - probieren Sie es aus, aktivieren Sie die GC-Protokollierung und sehen Sie? Außerdem, aus Neugier: Was machst du da, das genug Müll für 60% Zeit in GC erstellt, um nicht viel zu sein? – millimoose

Antwort

1

Sie können nicht eine Decke für die CPU-Auslastung während der GC-Sammlungen festlegen.

Die CMSIncrementalDutyCycle wird die Zeit zwischen den kleineren Sammlungen (siehe [1]) eingestellt verwendet, so können Sie steuern, wie oft der GC läuft und damit indirekt die CPU-Auslastung. Aber es gibt keinen Parameter, mit dem Sie die CPU-Auslastung direkt steuern können.

+1

ist Tatsächlich bietet der CMSIncrementalDutyCycle nur eine indirekte Kontrolle davon. Leider wurde mein Problem dadurch gelöst, dass die junge Generation drastisch reduziert wurde. Vielen Dank für alles. – mors

1

Ich wollte, um zu bestätigen, dass die XX: CMSIncrementalDutyCycle = 60 Parameter ist die thig ich suche und ob es noch andere Parameter ist mehr Kraft auf die GC geben (ich habe bereits die CMSIncrementalPacing gesehen und CMSIncrementalDutyCycleMin)

Nein, Sie liegen falsch. Dieses Flag steuert nicht, welcher Prozentsatz der verfügbaren CPU dem JVM-GC zugewiesen wird. In der Dokumentation:

-XX:CMSIncrementalDutyCycle=<N> default: 50 

Dies ist der Prozentsatz (0-100) der Zeit zwischen kleinere Sammlungen, dass die gleichzeitige Kollektor ausgeführt werden darf. Wenn CMSIncrementalPacing aktiviert ist, dann ist dies nur der Anfangswert.

Also, vorausgesetzt, dass Sie den CMS-Kollektor (-XX:+UseConcMarkSweepGC) verwenden, dann wird die Flagge oben steuert den Prozentsatz der Zeit die CMS erlaubt ist, zwischen kleineren GC Sammlungen auszuführen.

Es gibt kein Flag, mit dem Sie direkt steuern können, wie lange der GC-Thread ausgeführt wird.

+0

ok. Was passiert also zwischen Nebensammlungen außer den GC-Läufen? – mors

+0

Ihre Anwendung wird ausgeführt, die JIT kompiliert Methoden, etc. –

+0

Sie sollten auch davon ausgehen, dass -XX: + CMSIncrementalMode aktiviert ist, was keine gute Idee für "große" Box –

1

Zuerst wirkt sich CMSIncreamentalDutyCycle auf inkrementelles CMS-Algoright aus (das von -XX:+CMSIncrementalMode aktiviert werden sollte). Der inkrementelle Modus ist für Ihre Aufgabe in keiner Weise geeignet.

Zweitens können Sie die Anzahl der von GC-Aufgaben belegten CPU-Kerne begrenzen.

  • -XX:ParallelGCThreads=N setzt Anzahl der Kern für Stop-the-World-Phasen
  • -XX:ConcGCThreads=N Sätze Anzahl der Kern für die gleichzeitige Aufgaben (nur für CMS)

Sie können here mehr GC bezogene Optionen finden.