2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Der Garbage Collector ist die spezifische Implementierung des Garbage Collection-Algorithmus . Da der Garbage Collector zusätzlich zu G1 (das sowohl die neue als auch die alte Generation steuern kann) in die junge und die alte Generation unterteilt ist,Die Garbage Collectors der neuen Generation und der alten Generation müssen entsprechend den Hotspot-Anforderungen paarweise verwendet werden.(Sie müssen die entsprechende Kombination entsprechend der JDK-Version auswählen)
Die spezifische Kombinationsbeziehung ist wie folgt:
Im zugrunde liegenden JVM-Quellcode ruft der CMS-Recycler in einigen Sonderfällen den Serial Old-Recycler auf.
Sie können nicht direkt sehen, welcher Garbage Collector verwendet wird, Sie können ihn nur anhand des Algorithmus ableiten.
Seriell ist einSingle-Threaded-Seriensammlung der jungen GenerationDer Müllsammler.
Hervorragender Durchsatz auf einem einzigen CPU-Prozessor
Der Durchsatz unter Multi-CPU ist nicht so gut wie bei anderen Garbage Collectors (Single-Threaded, nur eine CPU verwendend). Wenn der Heap zu groß ist, wartet der Benutzer-Thread lange.
In Java geschriebene Client-Programme oder Szenarien mit begrenzter Hardwarekonfiguration (nicht viele CPU-Kerne)
-XX: UseSerialGC
: Sowohl die neue als auch die alte Generation verwenden den seriellen Kollektor.
SerialOld ist die alte Generation des Serial Garbage CollectorsSingle-Threaded-Seriensammlung
Hervorragender Durchsatz auf einem einzigen CPU-Prozessor
Der Durchsatz unter Multi-CPU ist nicht so gut wie bei anderen Garbage Collectors. Wenn der Heap zu groß ist, wartet der Benutzerthread lange.
Wird mit dem Serial Garbage Collector oder in CMS-Sonderfällen verwendet
-XX: UseSerialGC
: Sowohl die neue als auch die alte Generation verwenden den seriellen Kollektor.
Der ParNew Garbage Collector ist im WesentlichenOptimierung von Serial unter mehreren CPUs, wobei Multithreading für die Speicherbereinigung verwendet wird
-XX: UseParNewGC
: Die neue Generation verwendet den ParNew-Kollektor und die alte Generation verwendet den seriellen Kollektor.Der CMS-Garbage Collector konzentriert sich auf die Pausenzeit des Systems (um STW zu minimieren und die Benutzererfahrung zu optimieren).Ermöglichen Sie die gleichzeitige Ausführung von Benutzer-Threads und Garbage-Collection-Threads in bestimmten Schritten, wodurch die Wartezeit von Benutzerthreads verkürzt wird.
1. Speicherfragmentierungsproblem
2. Verschlechterungsproblem (in einigen bestimmten Fällen wird es zu einem Single-Thread-Kollektor wie SerialOld degenerieren)
3. Problem mit schwimmendem Müll (einige Abfälle können während des Recyclingprozesses nicht recycelt werden)
Szenarien in großen Internetsystemen, in denen Benutzer große Datenmengen und hohe Frequenzen anfordern, z. B. Bestellschnittstellen, Produktschnittstellen usw.
XX: UseConcMarkSweepGC
, können Sie die Sammler der jungen Generation bzw. der alten Generation einstellen.
Hinweis: STW wird nur während der Erstmarkierungs- und Neumarkierungsphase angezeigt.
Mangel:
1. CMS verwendet einen Mark-and-Clear-Algorithmus. Nach Abschluss der Speicherbereinigung wird eine große Anzahl von Speicherfragmenten angezeigt, um die Zuordnung von Objekten nicht zu beeinträchtigen.CMS wird während der vollständigen GC defragmentiert. . Dadurch wird der Benutzerthread angehalten.Sie können den Parameter -XX:CMSFullGCsBeforeCompaction=N (Standard 0) verwenden, um den vollständigen GC N-mal anzupassen, bevor Sie ihn aussortieren.。
2. Der während des gleichzeitigen Bereinigungsprozesses erzeugte „schwebende Müll“ kann nicht verarbeitet werden und es kann keine vollständige Müllsammlung erreicht werden (während dieses Bereinigungsprozesses hat der Benutzerthread einige Objekte gleichzeitig erstellt, diese wurden jedoch nicht bald wieder verwendet. Diese Objekte sind nicht vorhanden Bei dieser Bereinigung recycelt und muss bis zur nächsten Bereinigung warten, weshalb es sich um schwimmenden Müll handelt.
3. Wenn in der alten Generation nicht genügend Speicher zum Zuweisen von Objekten vorhanden ist, degeneriert CMS zu Serial Old Single-Thread und recycelt die alte Generation.
Anzahl gleichzeitiger Threads:
Die Anzahl der Threads beim Ausführen der gleichzeitigen Phase im CMS kann übergeben werden-XX:ConcGCThreads
Parametereinstellung, vom System berechnet, die Berechnungsformel lautet(-XX:ParallelGCThreads定义的线程数 3) / 4
, ParallelGCThreads ist die Anzahl der parallelen Threads nach der STW-Pause
ParallelGCThreads wird durch die Anzahl der Prozessorkerne bestimmt:
1. Wenn die Anzahl der CPU-Kerne weniger als 8 beträgt, ist ParallelGCThreads = Anzahl der CPU-Kerne
2. Ansonsten ParallelGCThreads = 8 (Anzahl der CPU-Kerne – 8)*5/8
Es gibt 12 logische Prozessoren auf meinem Computer, also ParallelGCThreads = 8 (12 - 8) * 5/8 = 10, ConcGCThreads = (-XX: Die Anzahl der durch ParallelGCThreads 3 definierten Threads) / 4 = (10 3) / 4 = 3
Endlich könnt ihr dieses Bild machen:
Die gleichzeitigen Markierungs- und gleichzeitigen Reinigungsphasen werden parallel mithilfe von drei Threads verarbeitet. Die Neumarkierungsphase wird mit 10 Threads verarbeitet. Da die Anzahl der CPU-Kerne begrenzt ist, wirkt sich die gleichzeitige Phase auf die Leistung der Benutzer-Thread-Ausführung aus.
Parallel Scavenge istJDK8-Standard-Garbage Collector der jungen Generation,MultithreadingParallelsammlung,Konzentrieren Sie sich auf den Systemdurchsatz .Um den Durchsatz zu erhöhen, wird PSPassen Sie die Heap-Speichergröße automatisch an (passen Sie die Speichergröße der neuen Generation, der alten Generation und den Hochstufungsschwellenwert an).。
Parallel Scavenge ermöglicht die manuelle Einstellung der maximalen Pausenzeiten und des Durchsatzes. Oracle-Beamte empfehlen, bei Verwendung dieser Kombination den maximalen Heap-Speicher nicht festzulegen. Der Garbage Collector passt die Speichergröße automatisch basierend auf der maximalen Pausenzeit und dem maximalen Durchsatz an.
-XX:MaxGCPauseMillis=n
Legen Sie die maximale Pause in Millisekunden für jede Garbage Collection fest-XX:GCTimeRatio=n
Stellen Sie den Durchsatz auf n ein (Benutzer-Thread-Ausführungszeit = n/(n 1))-XX: UseAdaptiveSizePolicy
Mit dieser Einstellung kann der Garbage Collector die Speichergröße basierend auf dem Durchsatz und den maximalen Pausen-Millisekunden automatisch anpassen. Dieser Parameter ist standardmäßig aktiviert (Oracle empfiehlt, bei Verwendung der PS-Kombination den maximalen Wert des Heap-Speichers nicht festzulegen und den Garbage Collector automatisch anpassen zu lassen )Hinweis: Die beiden Indikatoren für maximale Pausenzeit und Durchsatz stehen im Konflikt. Der Garbage Collector wird sein Bestes tun, um die maximale Pausenzeit einzuhalten (manchmal ist sie zu klein eingestellt und kann nicht eingehalten werden, und die festgelegte maximale Pausenzeit wird überschritten). , was den Durchsatz opfert.Wenn Sie die maximale Pausenzeit und den Durchsatz gleichzeitig festlegen möchten, müssen Sie mehr Tests durchführen, um sie besser zu koordinieren.
Parallel Old ist eine Version der alten Generation, die für den Parallel Scavenge-Kollektor entwickelt wurde und eine gleichzeitige Multithread-Sammlung nutzt.
JDK8 legt Parameter fest, um diesen Recycler standardmäßig zu verwenden.
Parameter:-XX: UseParallelGC
oder-XX: UseParallelOldGC
Sie können die Kombination Parallel Scavenge Parallel Old verwenden.
-XX: PrintFlagsFinal
: Sie können beim Programmstart die Endwerte aller Konfigurationselemente ausdrucken. Sie können überprüfen, ob die automatische Anpassungsfunktion aktiviert ist.
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 垃圾回收器案例3
*/
//-XX: UseSerialGC -Xmn1g -Xmx16g -XX:SurvivorRatio=8 -XX: PrintGCDetails -verbose:gc -XX: PrintFlagsFinal
//-XX: UseParNewGC -Xmn1g -Xmx16g -XX:SurvivorRatio=8 -XX: PrintGCDetails -verbose:gc
//-XX: UseConcMarkSweepGC
//-XX: UseG1GC -Xmn8g -Xmx16g -XX:SurvivorRatio=8 -XX: PrintGCDetails -verbose:gc MaxGCPauseMillis
//-XX: PrintFlagsFinal -XX:GCTimeRatio = 19 -XX:MaxGCPauseMillis=10 -XX: UseAdaptiveSizePolicy
public class GcDemo2 {
public static void main(String[] args) throws IOException {
int count = 0;
List