Heim  >  Artikel  >  Java  >  Was sind die gängigen Garbage Collectors zur Java-Leistungsoptimierung?

Was sind die gängigen Garbage Collectors zur Java-Leistungsoptimierung?

王林
王林nach vorne
2023-04-20 11:40:121182Durchsuche

Gemeinsame Garbage Collectors und Algorithmen

Ich glaube, dass Sie in den beiden anderen Artikeln, die ich bereitgestellt habe, viel über Garbage Collectors lernen können. Die Garbage Collectors, auf die wir wirklich achten müssen und die wir möglicherweise sogar verwenden, sind die folgenden vier Typen:

serieller serieller Garbage Collector

Wenn es sich um eine virtuelle Maschine vom Typ client oder um einen handelt single Auf Servern mit core wird dieser Garbage Collector zum Standard-Garbage Collector. Unabhängig davon, ob es sich um Minor GC oder Full GC handelt, werden alle Anwendungsthreads angehalten. Serial Old wird in der alten Generation verwendet, bei der es sich auch um eine Single-Threaded-Version der alten Generation handelt. client型的虚拟机或者在单核的服务器上,这种垃圾回收器将会成为默认的垃圾回收器。无论是Minor GC 还是 Full GC ,所有的应用线程都会暂停。在老年代当中使用的是Serial Old,同样是单线程的老年代版本。

client型虚拟机,我们前面提到过编译类型分为client和server,jvm会通过client编译器(单线程)将代码编译成jvm识别的字节码。

可以通过如下标志表示:

    -XX:+UseSerialGC

Parallel 多线程垃圾收集器

在server型虚拟机或多线程服务器上,jdk8默认使用的垃圾收集器类型。

无论是Minor GC还是Full GC都使用多线程的方式去回收垃圾,这两种GC都会造成应用线程的暂停。但是它具有更多的吞吐量,是对于响应时间没有过多要求情况下,最合适的垃圾回收器。

可以通过如下标志查看其状态:

年轻代:

-XX:+UseParallelGC

老年代:

-XX:+UseParallelOldGC

CMS 收集器

其设计初衷是为了减少serial和parallel收集器,在回收时造成的长时间的系统卡顿。

它在发生Minor GC时同样会暂停所有的应用线程,不同之处在于,年轻代使用的不是parallel或者serial,而是使用一款专门适用于CMS的年轻代收集器ParNew

可以通过下面的标志查看:

-XX:+UseParNewGC

CMS在发生Full GC时不再暂停全部应用线程,使用多线程的方式,和应用线程同时运行,清理不在使用的对象。这事得CMS垃圾收集器的停顿时间得到大大的降低。与Parellel收集器相比,极其明显。

缺点

  • CMS需要占用较多的CPU资源,确保在应用线程运行时,gc线程不断地扫描堆空间。

  • 不会对内存进行压缩整理,导致内存碎片化。

如果没有足够的CPU资源,或者内存碎片化达到极限,将会退化成serial收集器。

可以通过下面的标志查看:

-XX:+UseConcMarkSweepGC

G1 收集器

也可以称作垃圾优先收集器(garbage first)。

设计初衷是为了尽量减少处理超大堆(4gb)时发生的卡顿。G1仍然属于分代收集器,但是不同之处是它是逻辑分代

Virtuelle Maschine vom Client-Typ, wir haben bereits erwähnt, dass der Kompilierungstyp in Client und Server unterteilt ist. Der JVM kompiliert den Code in den vom JVM erkannten Bytecode über den Client-Compiler (einzelner Thread).

kann durch die folgenden Flags dargestellt werden:

-XX:+UseG1GC

Paralleler Multithread-Garbage Collector

Auf virtuellen Maschinen vom Servertyp oder Multithread-Servern der von jdk8 standardmäßig verwendete Typ von Garbage Collector.

Sowohl Minor GC als auch Full GC verwenden Multithreading, um Müll zu sammeln. Beide Arten von GC führen dazu, dass der Anwendungsthread angehalten wird. Aber es hat einen höheren Durchsatz und ist der am besten geeignete Garbage Collector, wenn keine übermäßigen Anforderungen an die Reaktionszeit gestellt werden.

Sie können seinen Status anhand der folgenden Zeichen überprüfen:

Junge Generation:

System.gc;

Alte Generation:

rrreeeCMS-Sammler

Sein ursprüngliches Design besteht darin, die durch serielle und parallele Sammler verursachte lange Zeit beim Recycling zu reduzieren Das System steckt fest.
  • Es werden auch alle Anwendungsthreads angehalten, wenn Minor GC auftritt. Der Unterschied besteht darin, dass die junge Generation nicht parallel oder seriell verwendet, sondern einen Kollektor der jungen Generation ParNew, der speziell für CMS-Code geeignet ist. <p></p>
  • Sie können es anhand des folgenden Logos überprüfen:
  • rrreee

    CMS hält nicht mehr alle Anwendungsthreads an, wenn eine vollständige GC auftritt. Es verwendet Multithreading, um gleichzeitig mit Anwendungsthreads ausgeführt zu werden und Objekte zu bereinigen, die nicht mehr vorhanden sind im Einsatz. Dadurch wird die Pausenzeit des CMS-Garbage Collectors erheblich verkürzt. Äußerst offensichtlich im Vergleich zum Parellel-Kollektor.

Nachteile

: 🎜🎜🎜🎜CMS muss mehr CPU-Ressourcen belegen, um sicherzustellen, dass der GC-Thread den Heap-Speicherplatz kontinuierlich scannt, wenn der Anwendungsthread ausgeführt wird. 🎜🎜🎜🎜 komprimiert und organisiert den Speicher nicht, was zu einer Fragmentierung des Speichers führt. 🎜🎜🎜🎜Wenn nicht genügend CPU-Ressourcen vorhanden sind oder die Speicherfragmentierung das Limit erreicht, degeneriert sie zum seriellen-Kollektor. 🎜🎜🎜Kann an dem folgenden Logo angezeigt werden: 🎜🎜rrreee🎜G1-Kollektor🎜🎜Auch bekannt als Garbage First Collector (Garbage First). 🎜🎜Das ursprüngliche Design besteht darin, die Verzögerung zu minimieren, die bei der Verarbeitung extrem großer Heaps (4 GB) auftritt. G1 gehört immer noch zum Generationssammler, der Unterschied besteht jedoch darin, dass es sich um eine logische Generation handelt. G1 unterteilt den Heap-Speicherplatz in mehrere Regionen (Regionen). Die Garbage Collection der neuen Generation verwendet weiterhin die Methode, alle Anwendungsthreads anzuhalten, um überlebende Objekte in den Survivor-Speicherplatz der alten Generation zu kopieren. Auch die alte Generation ist in viele Bereiche unterteilt, und der G1-Kollektor erledigt die Aufräumarbeiten, indem er Objekte von einem Bereich in einen anderen kopiert. Dies löst das Problem der Speicherfragmentierung im CMS. 🎜🎜Wie CMS ist G1 auch ein gleichzeitiger Collector. Wenn in der alten Generation eine vollständige GC auftritt, schließt der Hintergrundthread die Recyclingarbeit ab, ohne den Anwendungsthread anzuhalten. 🎜🎜🎜Sehen Sie sich das folgende Logo an: 🎜🎜rrreee🎜Tatsächlich handelt es sich bei dem obigen Inhalt um eine einfache Beschreibung. Die tatsächlichen Implementierungsdetails finden Sie im Artikel am Anfang. 🎜🎜Explizite Garbage Collection🎜🎜🎜Die hier erwähnte explizite Garbage Collection bezieht sich tatsächlich auf eine manuell ausgelöste Garbage Collection, wie unten gezeigt: 🎜🎜rrreee🎜Dies ist eine Art Steuerung, die es der JVM ermöglicht, gc zu erzwingen Weg. Es wird nicht empfohlen, diese Methode zu irgendeinem Zeitpunkt für die Speicherbereinigung zu verwenden. 🎜🎜Wenn Sie diese Spezifikation verwenden, kommt es unabhängig von der Art des Garbage Collectors, sogar CMS oder G1, zu einer vollständigen GC und alle Anwendungsthreads werden gleichzeitig gestoppt, was zu einer langen Verzögerung führt. 🎜🎜🎜Ausnahmen: 🎜🎜🎜🎜🎜Leistungsanalyse, Tests🎜🎜🎜🎜Heap-Analyse🎜🎜🎜🎜In der oben genannten Situation hilft uns der Aufruf von System.gc besser, die Probleme der aktuellen Anwendung zu analysieren. 🎜

Das obige ist der detaillierte Inhalt vonWas sind die gängigen Garbage Collectors zur Java-Leistungsoptimierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen