Frage

Da Java 7 wird das neue G1 Garbage Collection standardmäßig verwendet wird Java der Lage sein, eine Größenordnung ohne größeren Haufen angeblich zu behandeln „verheerend“ GC Pausenzeiten? Hat jemand tatsächlich G1 in der Produktion umgesetzt, was waren Ihre Erfahrungen?

Um fair zu sein, die nur Zeit, die ich wirklich gesehen habe lange GC Pausen sind auf sehr große Haufen, viel mehr als eine Workstation haben würde. Um zu klären, meine Frage; wird G1 das Tor zu Haufen in den Hunderten von GB öffnen? TB?

War es hilfreich?

Lösung

Es klingt wie der Punkt G1 kleine Pausenzeiten haben, sogar bis zu dem Punkt, wo es die Möglichkeit, ein maximale Pausenzeit Ziel angeben hat.

Die Garbage-Collection ist nicht nur ein einfaches „Hey, es ist voll, lassen Sie uns bewegen, alles auf einmal neu anfangen“ beschäftigen mehr - es ist fantastisch komplexe, Multi-Level, Gewindehintergrundsystem. Es kann überhaupt keine Pausen im Hintergrund viel von ihrer Wartung tun, und es nutzt auch die Kenntnisse über die erwartete Muster des Systems zur Laufzeit zu helfen -. Wie die meisten Objekte sterben direkt nach dem erstellt unter der Annahme, etc

Ich würde sagen, GC Pausenzeiten weiter verbessern wollen, nicht verschlechtern, mit zukünftigen Versionen.

EDIT:

in Re-Lektüre fiel mir ein, dass ich Java verwenden täglich - Eclipse Azureus, und die apps, die ich entwickeln, und es ist schon lange her, seit ich eine Pause sah. Kein signifikantes Pause, aber ich meine jede Pause überhaupt.

Ich habe Pausen gesehen, als ich der rechten Maustaste auf Windows Explorer oder (gelegentlich), wenn ich bestimmte USB-Hardware anschließen, aber mit Java --- gar keine.

Ist GC immer noch ein Problem mit jemandem?

Andere Tipps

Ich habe es getestet mit einer schweren Anwendung heraus: 60-70GB zu Heap zugewiesen, mit 20-50GB im Einsatz jederzeit möglich. Mit dieser Art von Anwendungen ist es eine Untertreibung zu sagen, dass die Leistung kann variieren. Ich bin mit JDK 1.6_22 auf Linux. Die kleineren Versionen sind important-- vor etwa 1.6_20, gibt es Fehler in G1, die zufälligen Nullpointerexceptions verursacht wird.

Ich habe festgestellt, dass es sehr gut ist, in der Pause Ziel zu halten Sie ihnen geben, die meiste Zeit. Der Standard erscheint ein 100 ms (0,1 Sekunden) Pause zu sein, und ich habe erzählt es die Hälfte, das zu tun (-XX: MaxGCPauseMillis = 50). Sobald jedoch wird es wirklich wenig Speicher, es gerät in Panik und macht einen Punkt um die Welt Garbage Collection. Mit 65GB, nimmt die zwischen 30 Sekunden und 2 Minuten. (Die Anzahl der CPUs ist wahrscheinlich keinen Unterschied machen,. Es ist wahrscheinlich durch die Bus-Geschwindigkeit begrenzt)

Im Vergleich mit CMS (was nicht der Standard-Server-GC ist, aber es sollte für Web-Server und andere Echtzeit-Anwendungen sein), typische Pausen sind viel besser vorhersehbar und können viel kürzer gemacht werden. So weit ich habe mehr Glück mit CMS für die großen Pausen, aber das kann zufällig sein; Ich sehe sie nur ein paar Mal alle 24 Stunden. Ich bin sicher nicht, die wird man im Moment, aber wahrscheinlich G1 geeignetere in meiner Produktionsumgebung sein. Wenn Oracle Tuning hält es, wie ich vermute G1 wird letztlich der klare Sieger sein.

Wenn Sie nicht ein Problem mit dem bestehenden Müllsammler haben, gibt es keinen Grund G1 zu prüfen, gerade jetzt. Wenn Sie eine Low-Latency-Anwendung, wie zum Beispiel einer GUI-Anwendung ausgeführt wird, G1 ist wahrscheinlich die richtige Wahl, mit MaxGCPauseMillis gesetzt wirklich niedrig. Wenn Sie einen Batch-Modus-Anwendung laufen lassen, ist G1 Sie nichts kaufen.

Obwohl ich G1 in der Produktion nicht getestet haben, dachte ich, ich würde anmerken, dass GCs bereits problematisch sind für Fälle ohne „humongous“ Haufen. Insbesondere Dienste mit nur, sagen wir, 2 oder 4 Konzerte können stark von GC beeinflusst werden. Junge Generation GCs ist in der Regel nicht problematisch, da sie im einstelligen Millisekunde beenden (oder höchstens zweistelligen). Aber alte Generation Sammlungen sind viel problematischer, da sie mehrere Sekunden mit alter Generation nehmen Größen von 1 Gig oder höher.

Jetzt: in der Theorie kann CMS dort viel helfen, da sie gleichzeitig die meisten seiner Operation ausgeführt werden kann. Doch im Laufe der Zeit wird es Fälle geben, in denen es dies nicht tun kann und zurück zu „stoppen die Welt“ Sammlung fallen. Und wenn das geschieht (nach, sagen wir, 1 Stunde - nicht oft, aber immer noch zu oft), gut, halten Sie sich an Ihrem f *** ing Hüte. Es kann eine Minute oder länger dauern. Dies ist besonders problematisch für Dienste, die zu begrenzen maximale Latenz versuchen; statt es zu nehmen, sagen, 25 Millisekunden eine Anforderung dienen nun 10 Sekunden oder mehr dauert. Hinzufügen Verletzungen zu beleidigen Kunden wird dann oft Zeit aus der Anforderung und Wiederholungs, zu weiteren Problemen führen (auch bekannt als „shit storm“).

Dies ist ein Bereich, in dem G1 gehofft wurde viel zu helfen. Ich arbeitete für eine große Firma, die bietet Dienstleistungen für die Lagerung und Nachrichten Dispatching Cloud; und wir konnten verwenden CMS nicht da, obwohl ein großer Teil der Zeit, es funktionierte besser als parallel Sorten, es diese meltdowns hatte. So etwa eine Stunde Dinge waren schön; und dann traf Sachen den Ventilator ... und weil Dienst auf Cluster basiert, wenn ein Knoten in Schwierigkeiten geraten, andere typischerweise gefolgt (da GC-induzierte Timeouts zu anderen Knoten führen glauben Knoten abgestürzt war, was zu einer Re-Routen).

Ich glaube nicht, GC, dass viel von einem Problem für Anwendungen ist, und vielleicht sogar nicht-geclusterten Dienste sind weniger häufig betroffen. Aber mehr und mehr Systeme sind geclustert (insb. Durch NoSQL-Datenspeicher) und Heap-Größen wachsen. OldGen GCs ist super-linear zu Heap-Größe im Zusammenhang (was bedeutet, dass eine Verdoppelung mehr Heap-Größe als verdoppeln GC Zeit, unter der Annahme, Größe von Live-Datensatz auch verdoppelt).

Azul CTO Gil Tene, hat einen schönen Überblick über die Probleme, die mit Garbage Collection und eine Überprüfung verschiedener Lösungen in seiner Das Verständnis Java Garbage Collection und was Sie dagegen tun können Präsentation, und es gibt ein zusätzliches Detail in diesem Artikel: http://www.infoq.com/articles/azul_gc_in_detail .

Azul C4 Garbage Collector in unserem Zing JVM ist sowohl parallel als auch gleichzeitig, und verwendet den gleichen GC-Mechanismus sowohl für die neuen und alten Generationen, gleichzeitig zu arbeiten und in beiden Fällen zu verdichten. Am wichtigsten ist, hat C4 keine Stop-the-Welt zurückgreifen. Alle Verdichtung erfolgt gleichzeitig mit der laufenden Anwendung. Wir haben Kunden laufen sehr groß (mehrere hundert GBytes) mit schlimmeren Fall GC Pausenzeiten von <10 ms und in Abhängigkeit von der Anwendung oft weniger als 1-2 msec.

Das Problem mit CMS und G1 ist, dass an einem gewissen Punkt Java Heap-Speicher komprimiert werden muß, und diese beiden Müllmann Stop-the-world / STW (d Pause der Anwendung) Verdichtung durchzuführen. Während also CMS und G1 kann STW Pausen schieben, sie nicht beseitigen. Zu C4, jedoch nicht vollständig eliminieren STW Pausen und deshalb Zing so niedrige GC hat Pausen auch für gigantische Speichergrößen.

Und eine Erklärung in einer früheren Antwort zu korrigieren, Zing erfordert keine Änderungen an das Betriebssystem. Es läuft wie jede andere JVM auf unmodifizierte Linux-Distributionen.

Wir verwenden bereits G1GC, von fast zwei Jahren. Sein Tun groß in unserer unternehmenskritischen Transaktionsverarbeitungssystem, und es erwies sich als eine große Unterstützung w.r.t hohen Durchsatz, geringe Pausen, Parallelität und optimierte Schwerspeicherverwaltung sein.

Wir sind mit JVM-Einstellungen folgendermaßen vor:

-server -Xms512m -Xmx3076m -XX:NewRatio=50 -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -XX:+AggressiveOpts -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=400 -XX:GCPauseIntervalMillis=8000 -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime

Aktualisiert

-d64 -server -Xss4m -Xms1024m -Xmx4096m -XX:NewRatio=50 -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:+HeapDumpOnOutOfMemoryError -XX:-DisableExplicitGC -XX:+AggressiveOpts -Xnoclassgc -XX:+UseNUMA -XX:+UseFastAccessorMethods -XX:ReservedCodeCacheSize=48m -XX:+UseStringCache -XX:+UseStringDeduplication -XX:MaxGCPauseMillis=400 -XX:GCPauseIntervalMillis=8000

Der G1 Kollektor reduziert die Auswirkungen einer vollständigen Sammlungen. Wenn Sie eine Anwendung, wo Sie bereits die Notwendigkeit einer vollständigen Sammlungen reduziert haben, ist die gleichzeitige Karte Sweep Sammler genauso gut und in meiner Erfahrung kürzere kleinere Leerungszeiten hat.

Es scheint, wie G1 JDK7u4 Start wird schließlich offiziell unterstützt, finden Sie in der RN für JDK7u4 http://www.oracle.com/technetwork/java/javase /7u4-relnotes-1575007.html .

Von unseren Tests immer noch für großen JVMs abgestimmt CMS wirkt immer noch besser als G1, aber ich denke, es ist besser wachsen wird.

CMS kann auch zu langsam verringerten Leistung führen, wenn Sie es laufen ohne tenured Objekte zu akkumulieren. Dies ist wegen der Fragmentierung des Speichers, die G1 angeblich vermeidet.

Der Mythos über G1 nur mit bezahlter Unterstützung ist nur, dass ein Mythos. Sun und jetzt Oracle geklärt dies auf der JDK-Seite.

G1 GC soll, besser arbeiten. Aber wenn Einstellung -XX: MaxGCPauseMillis zu aggressiv, Müll wird zu langsam sein zu sammeln. Und deshalb voll GC ausgelöst in David Leppik dem Beispiel.

Ich habe gerade G1 Garbage Collector in unserem Terracotta Big Speicher Projekt umgesetzt. Während auf verschiedene Arten von Kollektoren arbeiten gab G1 uns die besten Ergebnisse mit weniger als 600 ms reagiert Zeit.

Sie können die Testergebnisse (insgesamt 26) finden hier

Hope es hilft.

Vor kurzem wurden zog ich von

CMS G1GC mit 4G heap & 8-Core-Prozessor auf Servern mit JDK 1.7.45 .

(JDK 1.8.x G1GC über 1,7 bevorzugt, aber aufgrund einiger Einschränkungen, muss ich Stick 1.7.45 Version)

Ich habe unten Schlüsselparameter konfiguriert und hielt alle anderen Parameter auf die Standardwerte.

-XX:G1HeapRegionSize=n, XX:MaxGCPauseMillis=m, -XX:ParallelGCThreads=n, 
-XX:ConcGCThreads=n apart from -Xms and -Xmx

Wenn Sie diese Parameter zur Feinabstimmung wollen, haben einen Blick auf diese Orakel Artikel.

Key Beobachtungen:

  1. Speichernutzung steht im Einklang mit G1GC im Gegensatz zu hoch und Tiefs mit CMS
  2. Max GC Pausenzeit ist weniger im Vergleich zu CMS
  3. Zeit in Garbage Collection ausgegeben ist wenig hoch in G1GC im Vergleich zu CMS.
  4. Die Anzahl der großen Sammlungen sind fast vernachlässigbar im Vergleich zu CMS
  5. Die Anzahl der kleineren Sammlungen sind auf den höheren Ende im Vergleich zu CMS

Aber ich bin immer noch froh, dass Max GC Pausenzeit weniger als als von CMS. Ich habe Max GC Pausenzeit eingestellt als 1,5 Sekunden und dieser Wert noch nicht überschritten.

Related SE Frage:

Java 7 (JDK 7 ) Garbage collection und Dokumentation auf G1

Ich habe vor kurzem Teil Twicsy auf einen neuen Server mit 128 GB RAM und entschieden migriert 1.7 zu verwenden. Ich begann die gleichen Speichereinstellungen ab, wie ich mit 1,6 verwendet (ich mehrere Instanzen haben verschiedene Dinge laufen zu tun, überall von 500 MB Haufen zu 15GB, und jetzt ein neues Geschäft mit 40GB) und die nicht gut überhaupt nicht trainieren . 1.7 scheint mehr Heap als 1,6 zu verwenden, und ich habe eine Menge Fragen über die ersten paar Tage erlebt. Ich glücklicherweise viel RAM zur Arbeit hatte mit und stieß den RAM für die meisten meiner Prozesse, aber immer noch einige Probleme hatte. Mein normaler MO war eine sehr kleine minimale Heap-Größe von 16m zu verwenden, auch mit einem max Haufen von mehreren Gigabyte, dann inkrementellen GC einschalten. Dies hielt die Pausen auf ein Minimum. Das funktioniert nicht jetzt aber, und ich musste über die Mindestgröße erhöhen, was ich erwartet habe im Durchschnitt in dem Heap zu verwenden, und das hat sehr gut geklappt. Ich habe immer noch inkrementelle GC eingeschaltet, aber ich werde es ohne versuchen. Keine Pausen auch immer jetzt, und die Dinge scheinen sehr schnell zu laufen. Also, ich denke, die Moral der Geschichte ist, nicht erwarten, dass Ihre Speichereinstellungen perfekt zu übersetzen 1,6-1,7.

G1 macht die Anwendung viel agiler: die latancy der Anwendung erhöhen - die App als „Soft-Echtzeit“ genannt werden. Dies geschieht durch den Austausch von zwei Arten von GC Läufen (kleine Minderjährige und eine großen auf Tenured Gen) zu gleich großen kleinen.

Für weitere Informationen Blick auf diese: http://geekroom.de/java/java-expertise-g1- Pelz-java-7 /

Ich arbeite mit Java, für kleine und große Haufen, und die Frage nach dem GC und GC Voll erscheint jeden Tag, wie die Beschränkungen strenger sein können als andere: in bestimmten Umgebung, 0,1 Sekunden von Scavenger GC oder Voll GC, töten einfach die fonctionnalité und haben feinkörnig Konfiguration und die Fähigkeit ist wichtig (CMS, iCMS, andere ... ist das Ziel hier die bestmögliche Antwortzeit mit der nahezu Echtzeit-Behandlung zu haben (hier die Echtzeit-Behandlung ist oft 25 ms), so, im Grunde alle Verbesserungen in GC Ergonomie ans heuristique ist willkommen!

Ich verwende G1GC auf Java 8 und auch mit Groovy (auch Java 8), und ich verschiedene Arten von Workloads tue, und overally G1GC funktioniert wie folgt:

  • Der Speicherverbrauch ist sehr gering, z.B. 100MB verglichen statt 500 MB Java-Einstellungen

  • auf dem Standard
  • Die Reaktionszeit ist konsistent und sehr niedrig

  • Die Leistung zwischen Standardeinstellung und G1GC beträgt 20% Verlangsamung, wenn G1GC im schlimmsten Fall mit (ohne Abstimmung, Single-Threaded-Anwendung). Es ist nicht viel angesichts gute Reaktionszeit und geringen Speicherverbrauch.

  • Wenn Sie von Tomcat ausgeführt wird, das multi-threaded ist, ist die Gesamtleistung 30% besser und Speicherverbrauch ist deutlich geringer als auch die Reaktionszeiten sehr viel niedriger sind.

Also insgesamt, wenn es wirklich verschiedene Workloads verwenden, G1GC ist sehr gut Kollektor für Java 8 für Multi-Threaded-Anwendungen und sogar für Single-Thread gibt es einige Vorteile.

Es ist nicht zu verwenden java8 w / G1GC für Schwimmer Punktberechnung mit Hotspot-wie JVM vorgeschlagen. Es ist gefährlich für die Anwendung Integrität und Genauigkeit.

https://bugs.openjdk.java.net/browse/JDK-8148175

JDK-8165766

JDK-8186112

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top