it-swarm.com.de

Java 7 (JDK 7) Garbage Collection und Dokumentation zu G1

Java 7 ist schon eine Weile nicht mehr verfügbar, aber ich kann keine guten Ressourcen für die Konfiguration der Garbage Collector finden, insbesondere der neuen G1 Collector =.

Meine Fragen:

  1. Ist G1 der Standardkollektor in Java 7 und wenn nicht, wie aktiviere ich G1?
  2. Welche optionalen Einstellungen hat g1 in Java7?
  3. Wurden Änderungen an anderen Kollektoren wie cms oder dem parallelen Kollektor vorgenommen? in Java 7?
  4. Wo finde ich eine gute Dokumentation zur Garbage Collection in Java 7?
80
Florakel

Der G1-Garbage-Collector ist in meiner Java-Installation, Version 1.7.0_01, nicht die Standardeinstellung. Sie können sich selbst davon überzeugen, indem Sie mit einigen zusätzlichen Befehlszeilenoptionen arbeiten:

> Java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -version
-XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:ParallelGCThreads=4 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Heap
 PSYoungGen      total 37696K, used 1293K [0x00000007d5eb0000, 0x00000007d88c0000, 0x0000000800000000)
  eden space 32320K, 4% used [0x00000007d5eb0000,0x00000007d5ff3408,0x00000007d7e40000)
  from space 5376K, 0% used [0x00000007d8380000,0x00000007d8380000,0x00000007d88c0000)
  to   space 5376K, 0% used [0x00000007d7e40000,0x00000007d7e40000,0x00000007d8380000)
 PSOldGen        total 86144K, used 0K [0x0000000781c00000, 0x0000000787020000, 0x00000007d5eb0000)
  object space 86144K, 0% used [0x0000000781c00000,0x0000000781c00000,0x0000000787020000)
 PSPermGen       total 21248K, used 2032K [0x000000077ca00000, 0x000000077dec0000, 0x0000000781c00000)
  object space 21248K, 9% used [0x000000077ca00000,0x000000077cbfc288,0x000000077dec0000)

Sie müssen keine experimentellen Optionen mehr aktivieren, um den G1-Collector einzuschalten:

> Java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseG1GC -version
-XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation
Java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Heap
 garbage-first heap   total 130048K, used 0K [0x000000077ca00000, 0x0000000784900000, 0x00000007fae00000)
  region size 1024K, 1 young (1024K), 0 survivors (0K)
 compacting perm gen  total 20480K, used 2032K [0x00000007fae00000, 0x00000007fc200000, 0x0000000800000000)
   the space 20480K,   9% used [0x00000007fae00000, 0x00000007faffc288, 0x00000007faffc400, 0x00000007fc200000)
No shared spaces configured.

Ich weiß nicht, wo Sie eine gute Dokumentation finden können.

47
Carey

Oracle machte G1 schließlich offiziell in Java 7 U4: http://www.Oracle.com/technetwork/Java/javase/7u4-relnotes-1575007.html

Beschreibung: http://docs.Oracle.com/javase/7/docs/technotes/guides/vm/G1.html

Befehlszeilenoptionen: http://www.Oracle.com/technetwork/Java/javase/tech/vmoptions-jsp-140102.html#G1Options

Ich glaube immer noch nicht, dass es der Standardkollektor in Java 7 ist. Für Server ist der Standard der Parallelkollektor wie in Java 6.

31
Florakel

Ja, G1 ist der neue Standard-Garbage Collector in Java 1.7 JVM.

Hier Hier finden Sie zahlreiche Informationen zur Verwendung und Konfiguration des neuen Garbage Collectors:

Die Verwendung von G1 G1 wird weiterhin als experimentell betrachtet und kann mit den folgenden beiden Parametern aktiviert werden:

-XX: + UnlockExperimentalVMOptions -XX: + UseG1GC

Verwenden Sie den folgenden Parameter, um ein Ziel für die GC-Pausenzeit festzulegen:

-XX: MaxGCPauseMillis = 50 (für ein Pausenzeitziel von 50 ms)

Mit G1 kann ein Zeitintervall angegeben werden, in dem eine GC-Pause nicht länger als die oben angegebene Zeit dauern soll:

-XX: GCPauseIntervalMillis = 200 (für ein Pausenintervall von 200 ms)

Beachten Sie, dass die beiden oben genannten Optionen Ziele darstellen, keine Versprechen oder Garantien. In einigen Situationen funktionieren sie möglicherweise gut, in anderen jedoch nicht, und der GC ist möglicherweise nicht immer in der Lage, ihnen Folge zu leisten.

Alternativ kann die Größe der jungen Generation explizit angegeben werden, um die Evakuierungspausenzeiten zu beeinflussen:

-XX: + G1YoungGenSize = 512 m (für eine junge Generation mit 512 Megabyte)

G1 verwendet auch das Äquivalent von Überlebensräumen, bei denen es sich natürlich um eine Reihe von (möglicherweise nicht zusammenhängenden) Regionen handelt. Ihre Größe kann mit den üblichen Parametern angegeben werden (z. B. -XX: SurvivorRatio = 6).

Um G1 vollständig zu nutzen, stellen Sie diese beiden Parameter ein, die derzeit standardmäßig deaktiviert sind, da sie möglicherweise eine seltene Race-Bedingung aufdecken:

-XX: + G1ParallelRSetUpdatingEnabled -XX: + G1ParallelRSetScanningEnabled

Eine weitere Bemerkung ist, dass G1 im Vergleich zu anderen HotSpot-GCs sehr ausführlich ist, wenn -XX: + PrintGCDetails eingestellt ist. Dies ist darauf zurückzuführen, dass das Pro-GC-Thread-Timing und andere Informationen gedruckt werden, die bei der Profilerstellung und Fehlerbehebung sehr hilfreich sind. Wenn Sie ein präziseres GC-Protokoll wünschen, wechseln Sie bitte zu -verbosegc (es wird jedoch empfohlen, das detailliertere GC-Protokoll zu erhalten).

Ich fand auch this Artikel sehr hilfreich für das Verständnis der Innereien von G1.

Noch mehr Infos hier .

22

1. Ist G1 der Standardkollektor in Java 7 (...)

Die Regel auf diese Java 5 Seite gilt weiterhin in Java 7 (und AFAIK, Java 8):

Auf Serverklasse Computern, auf denen die Server-VM ausgeführt wird, wurde der Garbage Collector (GC) vom vorherigen seriellen Collector (-XX: + UseSerialGC) in einen parallelen Collector (-XX: + UseParallelGC) geändert. .

Aber bedenken Sie auch:

  • 64-Bit-JVMs werden nicht mit einer -client - VM geliefert, sind also immer "Serverklasse"
  • Seit Java 7 impliziert die Verwendung von -XX: + UseParallelGC (ob gesetzt oder impliziert) zusätzlich -XX: + UseParallelOldGC (d. H. Sofern nicht ausdrücklich deaktiviert)

Wenn Sie beispielsweise unter Windows x64 Folgendes ausführen ...

  • Mit Java 7 64-Bit erhalten Sie standardmäßig Parallel GC (für junge und alte Generationen).
  • Mit Java 8 32-Bit erhalten Sie standardmäßig Serial GC (für beide Generationen)

1. (...) Wie aktiviere ich G1?

Ab Java 7 einfach -XX:+UseG1GC. Vielleicht interessiert auch wann Sie möchten:

Anwendungen, die heute entweder mit dem CMS oder dem ParallelOld-Garbage-Collector ausgeführt werden, würden von einem Wechsel zu G1 profitieren, wenn die Anwendung eine oder mehrere der folgenden Eigenschaften aufweist.

  • Mehr als 50% des Java Heaps sind mit Live-Daten belegt.
  • Die Rate der Objektzuweisung oder Promotion variiert erheblich.
  • Unerwünschte lange Speicherbereinigungs- oder Verdichtungspausen (länger als 0,5 bis 1 Sekunde)

2. Welche optionalen Einstellungen hat g1 in Java7?

Ich habe G1 nicht selbst verwendet, aber Ich verstehe dass es denselben grundlegenden "Durchsatz/Ergonomie" -Flaggen entspricht, die zum Abstimmen der anderen parallelen Kollektoren verwendet wurden. Nach meiner Erfahrung mit dem Parallel-GC war -XX:GCTimeRatio Der ausschlaggebende Faktor für den erwarteten Kompromiss zwischen Geschwindigkeit und Speicher. YMMV.

G1-spezifische Optionen sind aufgeführt hier

3. Gab es Änderungen an (...) cms oder dem Parallel Collector in Java 7?

Weiß nicht, aber ...

G1 ist als langfristiger Ersatz für den Concurrent Mark-Sweep Collector (CMS) geplant.

4. Wo finde ich eine gute Dokumentation zur Garbage Collection in Java 7?

Es kann ein Schmerz sein, es zu finden, nicht wahr? Die wahrscheinlich beste "Hub" -Seite, die ich gefunden habe, ist diese:

http: //www.Oracle.com/technetwork/Java/javase/tech/index-jsp-140228.html

Es ist eine gründliche Lektüre erforderlich, aber die Zeit lohnt sich, wenn Sie etwas tunen müssen. Besonders aufschlussreich ist: Garbage Collector Ergonomics

13
Luke Usherwood
  1. Ist G1 der Standardkollektor in Java 7 und wenn nicht, wie aktiviere ich G1?

G1 ist in Java 7 kein Standardkollektor. -XX:+UseG1GC Aktiviert G1GC

  1. Welche optionalen Einstellungen hat g1 in Java7?

Da sind viele. Schauen Sie sich diesen Oracle Artikel an, um vollständige Informationen zu erhalten.

Der G1 GC ist ein adaptiver Garbage Collector mit Standardeinstellungen, die ein effizientes Arbeiten ohne Änderungen ermöglichen.

Passen Sie aus diesem Grund kritische Parameter an

-XX:MaxGCPauseMillis
-XX:G1HeapRegionSize
-XX:ParallelGCThreads
-XX:ConcGCThreads

und alle anderen Parameter auf Standardwert belassen.

Hier finden Sie eine Liste wichtiger Optionen und deren Standardwerte. Diese Liste gilt für die neueste Java HotSpot-VM, Build 24. Sie können die G1 GC-Einstellungen in der JVM-Befehlszeile anpassen und anpassen.

Wichtige Standardeinstellungen:

-XX:G1HeapRegionSize=n

Legt die Größe einer G1-Region fest. Der Wert ist eine Zweierpotenz und kann zwischen 1 MB und 32 MB liegen. Das Ziel ist es, ungefähr 2048 Regionen basierend auf der minimalen Java Heap-Größe zu haben.

-XX:MaxGCPauseMillis=200

Legt einen Zielwert für die gewünschte maximale Pausenzeit fest. Der Standardwert ist 200 Millisekunden. Der angegebene Wert passt sich nicht an Ihre Heap-Größe an.

-XX:G1NewSizePercent=5

Legt den Prozentsatz des zu verwendenden Heapspeichers als Minimum für die Größe der jungen Generation fest. Der Standardwert beträgt 5 Prozent Ihres Java - Heapspeichers.

-XX:G1MaxNewSizePercent=60

Legt den Prozentsatz der Heap-Größe fest, der als Maximum für die Größe der jungen Generation verwendet werden soll. Der Standardwert ist 60 Prozent Ihres Java - Heapspeichers.

-XX:ParallelGCThreads=n

Legt den Wert der STW-Arbeitsthreads fest. Legt den Wert von n auf die Anzahl der logischen Prozessoren fest. Der Wert von n entspricht der Anzahl der logischen Prozessoren bis zu einem Wert von 8.

Wenn mehr als acht logische Prozessoren vorhanden sind, wird der Wert von n auf ungefähr 5/8 der logischen Prozessoren festgelegt. Dies funktioniert in den meisten Fällen mit Ausnahme größerer SPARC Systeme, in denen der Wert von n ungefähr 5/16 der logischen Prozessoren betragen kann.

-XX:ConcGCThreads=n

Legt die Anzahl der parallelen Markierungsfäden fest. Legt n auf ungefähr 1/4 der Anzahl paralleler Garbage Collection-Threads (ParallelGCThreads) fest.

-XX:InitiatingHeapOccupancyPercent=45

Legt den Schwellenwert für die Heap-Belegung Java fest, der einen Markierungszyklus auslöst. Die Standardbelegung beträgt 45 Prozent des gesamten Java - Heapspeichers.

-XX:G1MixedGCLiveThresholdPercent=65

Legt den Belegungsschwellenwert für eine alte Region fest, die in einen gemischten Speicherbereinigungszyklus aufgenommen werden soll. Die Standardbelegung beträgt 65 Prozent

-XX:G1HeapWastePercent=10

Legt den Prozentsatz des Heapspeichers fest, den Sie verschwenden möchten. Der HotSpot Java VM leitet den gemischten Garbage Collection-Zyklus nicht ein, wenn der Prozentsatz für die Rückgewinnung geringer ist als der Prozentsatz für den Heap-Abfall

-XX:G1MixedGCCountTarget=8

Legt die Zielanzahl gemischter Garbage Collections nach einem Markierungszyklus fest, um alte Regionen mit höchstens G1MixedGCLIveThresholdPercent-Live-Daten zu erfassen. Die Standardeinstellung ist 8 gemischte Speicherbereinigungen

-XX:G1OldCSetRegionThresholdPercent=10

Legt eine Obergrenze für die Anzahl der alten Regionen fest, die während eines gemischten Speicherbereinigungszyklus erfasst werden sollen. Der Standardwert beträgt 10 Prozent des Heapspeichers Java

-XX:G1ReservePercent=10

Legt den Prozentsatz des freien Reservespeichers fest, um das Risiko eines Überlaufs des Speicherplatzes zu verringern. Der Standardwert beträgt 10 Prozent. Stellen Sie beim Erhöhen oder Verringern des Prozentsatzes sicher, dass der Gesamtspeicher Java um denselben Betrag angepasst wird.

Sie haben viele G1GC-Parameter neu konfiguriert, die nicht erforderlich sind, wenn Sie der obigen Dokumentationsseite folgen. Bitte überprüfen Sie die obigen Empfehlungen, insbesondere für ParallelGCThreads und ConcGCThreads basierend auf Ihren CPU-Kernen. Entfernen Sie die Neukonfiguration nicht benötigter Parameter.

Empfehlungen von Oracle:

Beachten Sie bei der Bewertung und Feinabstimmung des G1 GC die folgenden Empfehlungen:

  1. Young Generation Size : Vermeiden Sie es, die Größe der jungen Generation explizit mit der Option -Xmn Oder einer anderen verwandten Option wie -XX:NewRatio. Die Festlegung der Größe der jungen Generation überschreibt das angestrebte Ziel für die Pausenzeit.

  2. Pausenzeitziele: Wenn Sie eine Garbage Collection bewerten oder optimieren, gibt es immer eine Latenz im Verhältnis zum Kompromiss zwischen Durchsatz. Der G1 GC ist ein inkrementeller Garbage Collector mit einheitlichen Pausen, aber auch mehr Aufwand für die Anwendungsthreads. Das Durchsatzziel für den G1 GC ist 90 Prozent Anwendungszeit und 10 Prozent Speicherbereinigungszeit.

  1. Wurden Änderungen an anderen Kollektoren wie cms oder dem parallelen Kollektor in Java 7 vorgenommen?

Es gibt einige Änderungen mit Java 7. Sehen Sie sich dies an Artikel

  1. Wo finde ich eine gute Dokumentation zur Garbage Collection in Java 7?

Weitere Informationen zu gc und verwandten SE-Fragen finden Sie auf der Oracle-Dokumentationsseite:

Java G1 Garbage Collection in der Produktion

10
Ravindra babu

Nein G1 ist in jdk 1.7.0_02 kein Standard-Garbage Collector. Der Standard-Garbage Collector hängt von der Computerklasse ab. Wenn der Computer der Serverklasse angehört, lautet der Standard-Garbage Collector Throughput Collector. Wenn der Computer der Client-Klasse angehört, lautet der Standard-Garbage Collector Serial Collector.

2
Nitan S. Kotwal

Die Dokumentation unter http://www.Oracle.com/technetwork/Java/javase/tech/g1-intro-jsp-135488.html (der von Wojtek bereitgestellte Link) scheint die einzige zu sein offizieller Link mit Info, aber die Info scheint veraltet zu sein, da einige der dort genannten Flags nur in den Testbuilds verfügbar waren und in den Produktionsreleases nicht mehr vorhanden sind. Jemand von Oracle sollte eine aktualisierte Dokumentation zum G1 GC bereitstellen.

2
IceMan

Standardmäßig möchten Sie G1 Collector nicht wirklich verwenden, da es nicht wirklich besser als die anderen ist. Es ist nur für spezielle Zwecke gut.

In Anwendungen mit geringer Latenz ist es etwas besser als CMS, da es etwas kürzere und besser vorhersehbare Pausenzeiten aufweist. Dafür ist der Durchsatz deutlich schlechter als bei CMS.

Es ist also nur gut, wenn die Latenz wichtig ist, aber der Durchsatz ist überhaupt nicht wichtig. Wenn beides wichtig ist, bleiben Sie bei CMS.

0
Zoltan Juhasz