37 Stimmen

Java Concurrent und Parallel GC

Dieser Artikel aquí schlägt vor zu verwenden -XX:+UseParNewGC "Um eine parallele junge Generation GC mit der gleichzeitigen GC zu ermöglichen".

Meine Verwirrung ist, dass, um sowohl parallele und gleichzeitige GC zu aktivieren, sollte ich

  • verwenden. -XX:+UseParNewGC oder
  • beides verwenden -XX:+UseParNewGC et -XX:+UseConcMarkSweepGC ?

PS

Ich verwende JVM 6.

38voto

sk. Punkte 6196

Da das Dokument, das Sie verlinkt haben, für eine 1.4.2 VM war, gehe ich davon aus, dass Sie diese verwenden (JVMs 5 und 6 verhalten sich anders).

Von http://java.sun.com/docs/hotspot/gc1.4.2/

wenn in der Befehlszeile -XX:+UseConcMarkSweepGC verwendet wird in der Befehlszeile verwendet wird, wird das Flag UseParNewGC auch auf true gesetzt, wenn es nicht explizit auf der Kommandozeile gesetzt ist Befehlszeile

Die Antwort ist also, dass Sie nur -XX:+UseConcMarkSweepGC verwenden müssen, um den Concurrent Collector mit dem parallelen Young Generation Collector zu aktivieren.

Bearbeiten: Für Java 6 aktiviert das gleiche Flag (-XX:+UseConcMarkSweepGC) den Concurrent Collector. Die Wahl des Kollektors hängt von einigen Dingen ab, und Sie sollten verschiedene Konfigurationen testen. Es gibt jedoch einige sehr allgemeine Richtlinien. Wenn Sie einen Rechner mit einem Prozessor und einem Thread haben, sollten Sie den seriellen Kollektor verwenden (Standard für einige Konfigurationen, kann explizit mit -XX:+UseSerialGC aktiviert werden). Für Multiprozessor-Maschinen, bei denen die Arbeitslast grundsätzlich an die CPU gebunden ist, sollten Sie den parallelen Kollektor verwenden. Dieser ist standardmäßig aktiviert, wenn Sie das Flag -server verwenden, oder Sie können ihn explizit mit -XX:+UseParallelGC aktivieren. Wenn Sie die GC-Pausen kürzer halten möchten, dafür aber mehr Gesamt-CPU-Zeit für die GC benötigen, und Sie mehr als eine CPU haben, können Sie den Concurrent-Collector (-XX:+UseConcMarkSweepGC) verwenden. Beachten Sie, dass der Concurrent Collector für eine bestimmte Arbeitslast tendenziell mehr der JVM zugewiesenes RAM benötigt als der serielle oder parallele Collector, da eine gewisse Speicherfragmentierung auftreten kann.

8voto

tpoindex Punkte 231

In diesem Blogeintrag finden Sie eine gute Übersicht über die verschiedenen Sammler und welche Optionen gültig sind: http://blogs.oracle.com/jonthecollector/entry/our_collectors

7voto

anjanb Punkte 12084

5voto

Charles Munger Punkte 1407

Java GC-Tuning ist im Grunde eine dunkle Kunst, aber in meiner Anwendung (die mit einem 50+ GB großen Heap und 16 physischen Kernen läuft) führte der ConcMarkSweep-Kollektor zu einer dreifachen Beschleunigung gegenüber dem -server-Standard und zu einer 2,2-fachen Beschleunigung gegenüber ParallelOldGC.

Wenn Sie den Rechner nicht mit anderen Prozessen teilen (so dass ungenutzte Kerne einfach verschwendet werden), verwenden Sie ConcMarkSweepGC.

2voto

Deven Punkte 386

Sie müssen nur -XX:+UseConcMarkSweepGC angeben, um CMS zu verwenden, und ParNew wird standardmäßig verwendet. CMS ist ein guter Collector, wenn die Vermeidung von GC-Jitters eine höhere Priorität hat, aber wenn der Durchsatz wichtiger ist, z. B. bei einem Batch-ähnlichen Auftrag, leistet der standardmäßige SUN-Parallel-Collector bessere Arbeit.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X