2013-04-16 15 views
24

Jeder Java-Prozess, den ich auf meinem Rechner starte, scheint standardmäßig 2 Müllsammler zu haben. Ich überprüfe das über JConsole.Mehrere Müllsammler in Java

Beispiel - für meine derzeit laufende Eclipse.

PS MarkSweep

Collection Count - 221 
Collection Time - 102118 
Memory Pool Names - java.lang.String[4] 

PS Scavenge

Collection Count - 241 
Collection Time - 2428 
Memory Pool Names - java.lang.String[2] 

Ich gehe davon aus sie überlappende Pools haben. Wie arbeiten zwei Müllsammler zusammen, wenn sie dieselben Pools benutzen (Eden, Überlebender, alte Generation)? Gibt es keine Überlappung in der Bewegung von Objekten zwischen Pools (Wie Bewegung von 1 Überlebenden zu einem anderen, wenn der zweite Algorithmus aufgerufen wird)? Auch wenn es nicht so ist, warum brauchen wir mehr als einen Sammler pro Pool?

Ich habe this article on GC gelesen. Sie beziehen sich auf die Verwendung unterschiedlicher Kollektoren für verschiedene Haupt- und Neben-GC, aber es scheint keine Bezugnahme auf die Verwendung mehrerer Kollektoren auf demselben Pool zu geben.

+0

Was ist so seltsam, verschiedene Sammler für verschiedene Generationen zu haben? – Mikhail

+0

Ich kann verschiedene Sammler für verschiedene Generationen verstehen, aber es scheint hier wie es mehrere Sammler für die gleichen Generationen gibt. Wie funktioniert das? –

+0

Wichtige Sammlungen reinigen alle Heap, nicht nur ältere Generation. – Mikhail

Antwort

34

Ich nehme an, sie haben überlappende Pools.

Diese Annahme ist falsch. PS Scavenge wird bei der jungen (eden, survivor) Generation eingesetzt und PS MarkSweep wird bei der alten Generation eingesetzt. Die einzige "Überschneidung" ist, dass PS Scavenge Objekte in die alte Generation verschieben wird, wenn sie schon eine Weile her sind und PS Marksweep dann mit ihnen umgehen kann.

Der Vorteil verschiedener Garbage Collectors für verschiedene Pools besteht darin, dass ein Algorithmus, der für Objekte im eden Pool gut funktioniert, nicht unbedingt gut für Objekte der alten Generation funktionieren wird.

This article covers the various options for different garbage collectors working together.

Soweit „großen“ Sammlungen, die auftreten, wenn kein Platz mehr ist, Objekte in die alte Generation zu bewegen, this (admittedly old) whitepaper from Sun sagt der folgende:

... die junge Generation Sammlung Algorithmus wird nicht ausgeführt. Stattdessen wird der Sammlungsalgorithmus der alten Generation auf dem gesamten Heap verwendet.

+0

Ich stieß auf diesen Artikel während der Suche, aber ich hörte kurz zu lesen im Detail, wie es für JDK 1.7.0_04 sagt, ich benutze 1.6. Danke, ich werde es lesen und sehen, ob es meine Frage beantwortet. –

+0

Markieren Sie es als die richtige Antwort, aber können Sie klären, welcher Sammler im Eden-Raum während einer großen Sammlung (die eine Sammlung auf dem gesamten Haufen läuft) verwendet wird? –

+1

@gap_j - Ich habe etwas über große Sammlungen hinzugefügt, die ich in einem alten Whitepaper gefunden habe, von dem ich hoffe, dass es immer noch korrekt ist. –

1

Formular der Artikel, den Sie zur Verfügung gestellt haben:

Typischerweise einige Bruchteil der überlebenden Objekte aus der jungen Generation werden bei jeder kleineren Sammlung an die fest angestellten Generation bewegt. Schließlich wird die Dauergeneration aufgefüllt und muss gesammelt werden, was zu einer großen Sammlung führt, in der der gesamte Haufen gesammelt wird. Wichtige Sammlungen dauern in der Regel viel länger als kleinere Sammlungen, weil eine wesentlich größere Anzahl von Objekten beteiligt sind.

+0

Die große Sammlung macht auch einen kleinen GC. Es gibt nicht an, welcher Kollektor für den untergeordneten GC während einer großen Sammlung verwendet wird. –