Wir haben einen JVM-Prozess, der die CPU selten zu 100% anpingt, wobei scheinbar ein (laut visualgc) fast leerer Heap vorliegt. Unsere Annahme ist, dass der Prozess heroisch GC'ing verursacht eine CPU-Spitze, die den gesamten Gesundheitszustand des gesamten Systems (bestehend aus anderen JVMs macht verschiedene Dinge) beeinflusst.
Dieser Prozess ist nicht kritisch und kann neu gestartet werden. Gibt es eine Möglichkeit, die JVM über die Befehlszeile abzustimmen, die sie so startet, dass sie auf ihr eigenes Schwert fällt, anstatt GC'ing zu behalten und die ganze Box zu leiden?
Bemerkenswert ist, dass wir keine OME-Exceptions bekommen, also ist der Heap nicht vollständig erschöpft, aber gerade nicht, denken wir.
Alternativ, etwas, um uns einen Einblick zu geben, was in der JVM tatsächlich die CPU in der Art verwendet, wie es unsere GC-Annahme bestätigen / leugnen soll?
Wir können die Statistiken von
abrufen1): Die Option -XX: + PrintGCTimeStamps fügt am Anfang jeder Sammlung einen Zeitstempel hinzu. Dies ist nützlich, um zu sehen, wie häufig Speicherbereinigungen auftreten.
Mit der obigen Option können wir grob abschätzen, ob Sie annehmen, dass der Prozess heroisch GC'ing verursacht eine CPU-Spitze oder nicht.
Wenn deine Annahme richtig ist, dann fang an, deinen GC zu tunen.
%Vor%Weitere Informationen zum Gc-Tuning in JVM finden Sie unter und Für vm-Debugging-Optionen überprüfen dies
Die parallelen und gleichzeitigen Collectors haben eine "Overhead-Grenze", die das tun kann, was Sie wollen:
Wenn mehr als 98% der Gesamtzeit in der Garbage Collection verbracht werden und weniger als 2% des Heaps wiederhergestellt werden, wird ein OutOfMemoryError ausgelöst
Siehe Ссылка für weitere Informationen.
Am besten ist es, den Speicherleck zu finden und zu beheben.
Eine einfache Methode zum Beenden bei hoher Speicherbelegung:
%Vor%Schauen Sie, welche Prozesse gerade in der JVM laufen.
jstack
können Sie einen Thread-Dump erstellen (es gibt auch andere Möglichkeiten, dies zu tun) jvisualvm
können Sie in den aktuellen Status der JVM schauen (benötigt einige Ressourcen) verbosegc
(um Ihre Annahme zu bestätigen, dass GC häufig ist) Sie müssen einen Weg finden, wie Sie eine Statistik über GC-Arbeit sammeln können. Tatsächlich gibt es einige Methoden, dies zu tun. Ich werde nicht kopieren-einfügen, nur geben Sie den Link zu ähnlichen Frage:
Können Sie grundlegende GC-Statistiken in Java erhalten?
Ich glaube, Sie werden darüber nachdenken, wie Sie diese Statistik analysieren und entscheiden können, wann GC ständig aktiv ist.
Da diese Frage eine neue Idee der GC-Statistik enthält, glaube ich nicht, dass es sich um eine Duplikate handelt.
Tags und Links java garbage-collection jvm