2013-09-03 17 views
5

Haben Sie Frage - ist es wahr, dass alle GC in JDK 7 (außer G1) immer Stop-the-World für junge Generation Sammlung verwenden?Müllsammler für junge Generation

dank

+0

Speziell zu Ihrer Anmerkung "(außer G1)" oben: G1s Kollektionen der jungen Generation sind genauso haltbar und monolithisch wie alle anderen HotSpot-Collectors in den Oracle- und OoenJDK-JVMs. In diesen JVMs gibt es keine jungen Sammler ohne Unterbrechung. –

Antwort

10

Für OpenJDK, JRockit, IBM JVM und Sun/Oracle JDK ist die junge Kollektion immer die Welt für jeden verfügbaren Sammler stoppen.

Die einzige JVM, die ich kenne, die keinen Weltkollektor hat, ist Azul's Zing. (Nicht frei)

Während OpenJDK/Hotspot CMS hat, ist dies meistens gleichzeitig. Es gibt immer noch die Welt Portionen und in einigen Fällen wird CMS auf einen Full GC zurückfallen, der Stop-the-World ist.

AFAIK, Es ist schwer, reale Beispiele zu finden, bei denen G1 in puncto Pausenzeit schneller ist als CMS, aber es verbessert sich ständig.

Do your GC logs speak to you

+2

Um genau zu sein, ist AFAIK, Zing derzeit der einzige Non-Stop-the-World Sammler junger Generation in einer Schifffahrts JVM. Für alle anderen JVMs (Oracle, OpenJDK, J9, jRockit, ...) und für alle ihre Sammler ist die Sammlung junger Generation ein monolithisches Stop-the-World-Event. Und das scheint sich in nächster Zeit nicht zu ändern. –

3

Nein ist es nicht wahr. Java 7 unterstützt auch den älteren Concurrent Mark Sweep (CMS) Collector. CMS ist ein Pausenkollektor, genau wie G1.

UPDATE

Offenbar CMS ist nur für die fest angestellten Generation ... nach dem Blog-Posting, dass Sie bei http://blogs.oracle.com/jonthecollector/entry/our_collectors

gefunden Das heißt also, dass Ihr Satz in der Tat wahr ist.


Man könnte argumentieren, dass all die Low-Pause Sammler: - Notwendigkeit, die Mutator-Threads zu stoppen einige Phasen ihrer Arbeit zu tun, und - kann die Marke/Sweep Full GC zurückgreifen Sammler, wenn sie nicht mithalten können.

Es gibt jedoch einen qualitativen Unterschied zwischen "meist gleichzeitigen" Sammlern wie G1 und CMS und anderen Sammlern, die Nicht-GC-Threads für die gesamte Dauer des Sammlungsvorgangs aussetzen. Das ist normalerweise mit einer "Stoppt die Welt" -Strategie gemeint.

+0

Wie ich weiß CMS wird nur für alte und permanente Generationen verwendet ...? –

+0

Woher haben Sie diese "Information"? Ich schlage vor, Sie lesen das - http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#cms –

+0

wie wäre es mit diesem: https://blogs.oracle.com/jonthecollector/ entry/our_collectors - ist es zu alt? –

5

All (fast) Java Müllsammler hat eine Art einer Stop-the-World-Phase, in der alle Java-Threads (nicht native Threads) warten aufgehängt sind für exklusive Systemoperationen abschließen zu. Dieser Zustand wird manchmal als ein Sicherheitspunkt bezeichnet.

Die modernen Garbage Collectors werden gleichzeitig mit den Anwendungsthreads ausgeführt, was bedeutet, dass der Garbage Collector seine Arbeit zur gleichen Zeit ausführt, zu der die Anwendungsthreads ausgeführt werden. Während des Garbage-Collector-Prozesses gibt es Phasen, in denen exklusiver Zugriffsspeicher benötigt wird. In dieser Phase gehen die Java-Threads der Anwendung in den sicheren Zustand über.

Eine Alternative, um die Stop-the-World-Garbage-Sammlungen loszuwerden, ist die Zing JVM mit dem C4-Collector von Azul-Systemen. Die Implementierung hat einen Ansatz mit geringer Pause und keine Stop-the-World-Sammlungen. Stattdessen verwendet es einen gleichzeitigen Komprimierungsansatz ohne Stop-the-World-Phase.