Wie der Titel schon sagt. Es ist eine Geschichte, als ich beim Ausführen von Spigot mit VPS verschiedene Java-Startoptionen durchgeführt habe.
Das Startskript finden Sie unter Spigot-Installation. Die Linux-Version wird unten als Beispiel angeführt.
start.sh
#!/bin/sh
java -Xms1G -Xmx1G -XX:+UseConcMarkSweepGC -jar spigot.jar
Die anfängliche Zuordnungsgröße von 1 GB Speicherpool entspricht -Xms1G, und die maximale Zuordnungsgröße von 1 GB entspricht -Xmx1G. Dies ist jedoch nur ** in einer Umgebung mit ausreichend Speicher **.
Wenn Sie eine 1-GB-Klassenbox mit VPS usw. bereitstellen, wird der Speicher um mehrere hundert MB in das System gesaugt. Da Spigot möglicherweise nicht mit dem obigen Startskript funktioniert, weisen Sie natürlich virtuellen Speicher zu und tauschen Sie den Speicher aus, wie er in Windows aufgerufen wird. (* In diesem Abschnitt wird ein Linux-basiertes Betriebssystem vorausgesetzt.) Zuerst ** 4 GB sind genug, und wenn nötig, können Sie es später hinzufügen **. Mit VPS ist die Festplattenkapazität begrenzt, daher halte ich diesen Bereich für sicher. ~~ Build Tools funktioniert jedoch möglicherweise nicht mit "OutOfMemoryError". Da meine Umgebung so war, baute ich sie gehorsam vor Ort. ~~
Ich habe es gelöst, indem ich Maven + α Speicher zugewiesen habe.
build.sh
#!/bin/sh
export MAVEN_OPTS="-Xmx2G -XX:+UseG1GC"
java -Xmx2G -XX:+UseG1GC -jar BuildTools.jar
Wenn die anfängliche Zuordnungsgröße des Speicherpools 1 GB beträgt, wird der Auslagerungsspeicher verwendet. Wie ich oben geschrieben habe, denke ich, dass das System ungefähr mehrere hundert MB verbrauchen wird und der Rest ungefähr 700 MB oder so sein wird. Wenn die anfängliche Zuordnungsgröße 1 GB mit den verbleibenden 700 MB beträgt, werden ca. 300 MB Swap-Speicher verwendet.
Swap-Speicher zu verwenden bedeutet, auf die Festplatte zu lesen und zu schreiben. Wenn es zu einer Verzögerung beim Schreiben kommt, kann dies zu Verzögerungen oder Rückspulen führen.
Wenn möglich, entfernen Sie die anfängliche Zuweisungsoption -Xms * oder sehen Sie sich die Hälfte der -Xms512M und die anfängliche Zuweisung bei etwa 512 MB an.
Übrigens wurde das Lesen und Schreiben der Festplatte in meiner Umgebung unterdrückt.
Ist es in Ordnung, -Xms * auszuschalten (zu löschen) oder zu reduzieren, aber das ist kein Problem. ** Wenn Sie zuerst Speicher zuweisen, ist dieser schneller, wenn Sie ihn verwenden (wenn Sie eine Instanz usw. im Programm erstellen). ** Dies ist keine erforderliche Option. Wenn Sie über genügend Speicher verfügen, gibt es keinen Grund, ihn auszuschalten.
Eine kurze Erklärung der Speicherbereinigung besteht darin, den nicht mehr benötigten Speicher freizugeben. Es ist ein Ort, um die Erinnerung zu bereinigen.
Referenz:
** CMS ** ist also eine Abkürzung für ** Concurrent Mark Sweep ** und einer der Garbage Collection-Algorithmen. Dies ist auch eine Reinigungsmethode. Wir werden den Speicher durch eine Reinigungsmethode namens CMS freigeben.
Übrigens hat das oben geschriebene Startskript -XX: + UseConcMarkSweepGC als Option zur Verwendung dieses CMS.
Es schien, dass es insbesondere mit CMS kein Problem gab, aber ich war besorgt, dass Full GC in meiner Umgebung ein wenig auftrat. OutOfMemoryError
ist nicht aufgetreten, aber es ist möglich, wenn es anschwillt.
Tatsächlich kann ** CMS in Zukunft unbrauchbar werden **. Bitte lesen Sie die Fortsetzung für Details.
Verwenden Sie nicht den inkrementellen Modus (-XX: + CMSIncrementalMode).
Der CMS-Kollektor kann in einem Modus verwendet werden, in dem die gleichzeitige Phase inkrementell ist. Wie bereits erwähnt, verwendet der Garbage Collector-Thread während der gleichzeitigen Phase einen oder mehrere Prozessoren. Der inkrementelle Modus soll die Auswirkungen der langfristigen gleichzeitigen Phase abschwächen, indem ** die gleichzeitige Phase periodisch gestoppt wird ** und der Prozessor an die Anwendung zurückgegeben wird.
Es bestand die Möglichkeit, dass aufgrund dieses "regulären Stopps" eine Verzögerung usw. aufgetreten war. Oder eher
Der inkrementelle Modus ist in Java SE 8 veraltet und wird möglicherweise in zukünftigen Hauptversionen entfernt.
Da dies der Fall ist, verwende ich keinen inkrementellen Modus.
Quelle: https://docs.oracle.com/javase/jp/8/docs/technotes/guides/vm/gctuning/cms.html
Garbage First Garbage Collector, kurz G1GC. Dies ist auch einer der Garbage Collection-Algorithmen. Dies ist jedoch ein neuer Typ!
Es wurde offiziell von Java7 (java7u4) implementiert und wird standardmäßig von Java9 verwendet. Und ** CMS ist veraltet **.
Der Garbage First (G1) Garbage Collector soll die meisten CMS-Anwendungen ersetzen.
Gibt es eine Möglichkeit, dass CMS in Zukunft durch Ersetzen gelöscht wird?
Quelle:
Referenz:
Der G1 GC ist ein adaptiver Garbage Collector, der effektiv verwendet und bearbeitet werden kann, ohne die Standardwerte zu ändern.
Schauen Sie sich zunächst den Zustand an, ohne etwas hinzuzufügen, da dort "effektiv funktioniert" steht.
Solange der Speicherpool ausreichend zugewiesen ist, erledigt Java VM den Rest automatisch. Toll!
Die JVM verfügt über verschiedene plattformspezifische Standardoptionen für Garbage Collector, Heap-Größe und Laufzeit-Compiler. Diese Auswahlmöglichkeiten erfüllen die Anforderungen verschiedener Anwendungen mit weniger Optimierung in der Befehlszeile. Darüber hinaus passt die verhaltensbasierte Optimierung die Heap-Größe dynamisch an das spezifische Verhalten der Anwendung an.
Quelle: Ergonomie
Die Verarbeitungsgeschwindigkeit steigt nicht über die Spezifikationen der Maschine hinaus. Es ist vielmehr ein Artikel, der Ihnen sagt, dass das Hinzufügen seltsamer Java-Startoptionen, ohne zu verstehen, zu Ineffizienz führt und Verzögerung und Rücklauf verursacht.
Welches CMS oder G1GC verwendet werden soll, hängt auch von der Umgebung ab. Wie ich oben geschrieben habe, ist CMS in Java 9 veraltet, daher ist es möglicherweise eine gute Idee, auf G1GC umzusteigen. In einer Umgebung mit niedrigen Spezifikationen fühlt sich G1GC jedoch etwas hart an (da G1GC eine etwas höhere CPU-Auslastung als CMS aufweist). Lesen Sie den folgenden Referenzartikel für den Grund!
Referenz:
Verwenden Sie bei Verwendung von G1GC die folgenden Optionen. Mit Java 9 und höher ist es nur ein Zauber.
start.sh
#!/bin/sh
java -Xms1G -Xmx1G -XX:+UseG1GC -jar spigot.jar
Eine der Funktionen von G1GC ist "Pausenzeitziel". Standardmäßig ist es mit 200 Millisekunden ziemlich niedrig, aber in meiner Umgebung dachte ich, dass es möglich wäre, die Verzögerung zu minimieren, indem man sie auf 50 Millisekunden ändert und die Verzögerung klein einstellt.
start.sh
#!/bin/sh
java -Xms1G -Xmx1G -XX:+UseG1GC -XX:MaxGCPauseMillis=50 -jar spigot.jar
Wenn Sie abstimmen möchten, ist es möglicherweise besser, die Einstellung auf diesem Niveau zu halten. Ich finde, dass das Placebo ein wenig effektiv ist. Es ist jedoch nicht gut, wenn es zu klein ist. Wenn also ein Problem auftritt, erhöhen Sie es. Derzeit findet in unserer Umgebung keine vollständige GC statt.
Da es verschiedene Dinge gibt, begrüße ich Tsukkomi, wenn etwas nicht stimmt. Ignorieren Sie andere "Was soll ich tun?" bitte beachte, dass.