Artikelverzeichnis
Schlüsselwörter
-
Garbage Collection gc
gc-Referenz: https://blog.csdn.net/xyc1211/article/details/88594745 -
Spitzenschnitt
-
Javas Safepoint-Safepoint-
Safepoint ist die Position einer OopMap-Aufzeichnungsanweisung (Ordinary Object Pointer Map). Die
Programmausführung kann nur angehalten werden, wenn sie den Safepoint erreicht, sodass der GC den Speichermüll zurückgewinnen kann -
Die Auswirkung der zählbaren Schleife (Counted Loop) und der unzählbaren Schleife (Uncounted Loop) auf den Sicherheitspunkt
Während der zählbaren Schleife kann der Sicherheitspunkt nicht eingegeben werden
-
Die Auswirkungen der Ausführung nativer Methoden durch JVM auf Safepoint
Wenn Sie native ausführen, wird der Grund für den sicheren Punkt eingegeben
: Die native Methode ist Code außerhalb der JVM. Bevor JVM externen Code aufruft, muss es seinen eigenen Status aufzeichnen, um die Ausführung fortzusetzen, nachdem die native Methode zurückgekehrt ist, und muss daher einen Sicherheitspunkt hinzufügen
Hintergrund
Um die schwere Belastung zu vermeiden, die durch zu viele Sicherheitspunkte in der virtuellen JVM-Maschine entsteht, legen einige Codes keine Sicherheitspunkte fest
Zum Beispiel die vom Typ int indizierte for-Schleife: Wenn der Typ int relativ klein ist, gehört er zu einer zählbaren Schleife (Counted Loop) und die Anzahl der Schleifen ist nicht sehr lang, sodass der Sicherheitspunkt nicht festgelegt wird
Wenn im Codesegment ohne Sicherheitspunkt viele zeitaufwändige Vorgänge ausgeführt werden, wird in diesem Zeitraum keine GC durchgeführt und eine Langzeit-GC ausgelöst führt
Lösung
- Idee:
GC-Vorgänge verteilen, Spitzen abschneiden und Täler füllen, mehrere kurze GCs ausführen, um lange GCs zu vermeiden und eine langfristige Müllsammlung zu verhindern
Lösung 1: Sicherheitspunkt manuell hinzufügen
Für das Codesegment ohne Sicherheitspunkt wird die native Methode in jedem zweiten Segment ausgeführt und der manuelle Auslöser tritt in den Sicherheitspunkt ein
//Thread.sleep(0) 是JNI调用,会进入safepoint
Thread.sleep(0)
Lösung 2: Ändern Sie den Code ohne Sicherheitspunkt in einen mit Sicherheitspunkt
Das Ändern der Counted-Schleife in eine Uncounted-Schleife
bedeutet, den Index der Schleife von int in long zu ändern.