Vermeiden Sie lange GC

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.

おすすめ

転載: blog.csdn.net/xyc1211/article/details/127902867