Wie man einen jvm statt heldenhaft zum Absturz bringt GC bis 100% CPU-Auslastung?

8

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?

    
Michael Campbell 17.01.2013, 18:31
quelle

5 Antworten

4

Wir können die Statistiken von

abrufen

1): 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

    
Imposter 18.01.2013 09:37
quelle
3

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.

    
parsifal 17.01.2013 19:25
quelle
2

Am besten ist es, den Speicherleck zu finden und zu beheben.

Eine einfache Methode zum Beenden bei hoher Speicherbelegung:

%Vor%     
irreputable 17.01.2013 18:49
quelle
2

Schauen Sie, welche Prozesse gerade in der JVM laufen.

  • mit jstack können Sie einen Thread-Dump erstellen (es gibt auch andere Möglichkeiten, dies zu tun)
  • mit jvisualvm können Sie in den aktuellen Status der JVM schauen (benötigt einige Ressourcen)
  • aktivieren Sie auch verbosegc (um Ihre Annahme zu bestätigen, dass GC häufig ist)
gaborsch 17.01.2013 18:50
quelle
1

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.

    
Andremoniy 17.01.2013 18:36
quelle

Tags und Links