Heim > Java > javaLernprogramm > So verwenden Sie JVM-Befehle in Java zur Fehlerbehebung bei Servern

So verwenden Sie JVM-Befehle in Java zur Fehlerbehebung bei Servern

青灯夜游
Freigeben: 2018-10-17 15:28:30
nach vorne
2518 Leute haben es durchsucht

In diesem Artikel erfahren Sie, wie Sie JVM-Befehle in Java verwenden, um die Server-Fehlerbehebung zu implementieren. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird Ihnen hilfreich sein.

1. top (Linux-Befehl)

Führen Sie den top-Befehl aus: (Sehen Sie sich die Details des Prozesses 15477 an, der unten verwendet wird)

 

Systeminformationen (erste fünf Zeilen):

    • Zeile 1: Informationen zur obersten Aufgabenwarteschlange (Systembetriebsstatus und durchschnittliche Auslastung), das gleiche Ergebnis wie uptime-Befehl.

      • Durchschnittliche Systemlast: Bei einer Single-Core-CPU bedeutet 0,00 keine Last, 1,00 bedeutet nur Volllast, mehr als 1 bedeutet Überlastung Idealwert ist 0,7;

      • Multi-Core-CPU-Last: Anzahl der CPU-Kerne * Idealwert 0,7 = Ideallast, zum Beispiel: 4-Core-CPU-Last überschreitet nicht 2,8, was bedeutet es gibt keine hohe Belastung.

      • Format: bis xx Tage, HH:MM

      • Zum Beispiel: 241 Tage, 20:11, bedeutet Dauerbetrieb für 241 Tage, 20 Stunden und 11 Minuten

      • Abschnitt 1: Aktuelle Systemzeit, zum Beispiel: 16:07:37

      • Absatz 2: Systemlaufzeit, die Zeit bis zum Neustart. Je länger die Zeit, desto stabiler ist das System.

      • Absatz 3: Die aktuelle Anzahl der angemeldeten Benutzer, zum Beispiel: 1 Benutzer, was bedeutet, dass derzeit nur 1 Benutzer angemeldet ist

      • Absatz 4 Segment: Systemlast, also die durchschnittliche Länge der Aufgabenwarteschlange. Die drei Werte zählen jeweils die durchschnittliche Systemlast in den letzten 1, 5 und 15 Minuten

    • Zeile 2: Aufgaben prozessbezogene Informationen

      • Absatz 1: Gesamtzahl der Prozesse, zum Beispiel: Aufgaben : 231 insgesamt, was bedeutet, dass insgesamt 231 Prozesse ausgeführt werden

      • Absatz 2: Anzahl der laufenden Prozesse, zum Beispiel: 1 läuft,

      • Absatz 3: Anzahl der schlafenden Prozesse, zum Beispiel: 230 schlafende,

      • Absatz 4: Anzahl der gestoppten Prozesse, zum Beispiel: 0 gestoppt,

      • Absatz 5: Anzahl der Zombie-Prozesse, zum Beispiel: 0 Zombie

    • Zeile 3: CPU-bezogene Informationen Wenn es sich um eine Multi-Core-CPU handelt, drücken Sie die Zahl 1 um die CPU-Informationen jedes Kerns anzuzeigen. Zu diesem Zeitpunkt wird die Zeile 1 in die Zeile mit der CPU-Kernnummer umgewandelt und die Nummer 1 kann hin und her geschaltet werden.

      • Absatz 1: us Prozentsatz der vom Benutzer belegten CPU , zum Beispiel: CPU(s): 12,7 % uns,

      • Absatz 2: syKernel-Speicherplatz belegt CPU-Prozentsatz, zum Beispiel: 8,4 %sy,

      • Absatz 3: ni Der CPU-Prozentsatz, der von Prozessen belegt wird, deren Prioritäten im Benutzerprozessbereich geändert wurden, zum Beispiel: 0,0 %ni,

      • Absatz 4: id Der CPU-Prozentsatz im Leerlauf, z Beispiel: 77,1 %id,

      • Absatz 5: wa Prozentsatz der CPU-Zeit, die auf Ein- und Ausgabe wartet, zum Beispiel: 0,0%wa,

      • Absatz 6 Absatz: hi Gesamtzeit, die die CPU für die Bearbeitung von Hardware-Interrupts aufgewendet hat, zum Beispiel: 0,0 %hi,

      • Absatz 7: si Gesamtzeit, die von der CPU aufgewendet wurde CPU-Wartungs-Soft-Interrupts, zum Beispiel: 1,8 %si,

      • Absatz 8: st Zeit stehlen Die CPU-Zeit, die der virtuellen Maschine vom Hypervisor gestohlen wurde (wenn die VM derzeit unter ein Hypervisor, tatsächlich verbraucht der Hypervisor auch einen Teil der CPU-Verarbeitungszeit)

    • Zeile 4: Mem-Speicherbezogene Informationen (Speicher: 12196436 KB insgesamt, 12056552 KB verwendet, 139884 KB frei, 64564 KB Puffer)

      • Segment 1: Gesamter physischer Speicher, zum Beispiel: Speicher: 12196436 KB insgesamt,

      • Absatz 2: Gesamtmenge des verwendeten physischen Speichers, zum Beispiel: 12056552k verwendet,

      • Absatz 3: Gesamtmenge des freien Speichers, zum Beispiel : Mem: 139884k frei,

      • Absatz 4: Die Menge an Speicher, die als Kernel-Cache verwendet wird, zum Beispiel: 64564k Puffer

    • Zeile 5: Informationen zur Swap-Partition (Swap: insgesamt 2097144 KB, 151016 KB verwendet, 1946128 KB frei, 3120236 KB zwischengespeichert)

      • Absatz 1: Gesamtgröße des Swap-Bereichs, zum Beispiel: Swap: 2097144k insgesamt,

      • Absatz 2: Gesamtmenge des genutzten Swap-Bereichs, zum Beispiel: 151016k genutzt,

      • Absatz 3 : Gesamtmenge des freien Swap-Bereichs, zum Beispiel: 1946128k frei,

      • Absatz 4: Gesamter gepufferter Swap-Bereich, 3120236k zwischengespeichert

Prozessinformationen:

Drücken Sie f im oberen Befehl, um die angezeigten Spalteninformationen anzuzeigen. Drücken Sie den entsprechenden Buchstaben, um die Spalte ein-/auszuschalten Buchstaben bedeuten aus. Die mit * gekennzeichneten Spalten sind die Standardspalten.

    • A: PID = (Prozess-ID) Prozess-ID;

    • E: USER = (Benutzername) Der Benutzername des Prozesseigentümers

    • H: PR = (Priorität) Priorität

    • I: NI = (Schöner Wert) Schöner Wert. Negative Werte stehen für hohe Priorität, positive Werte stehen für niedrige Priorität

    • O: VIRT = (Virtual Image (kb)) Der gesamte virtuelle Speicher Wird vom Prozess verwendet Menge, Einheit kb. VIRT=SWAP+RES

    • F: RES = (Residente Größe (kb)) Die Größe des physischen Speichers, der vom Prozess verwendet und nicht ausgelagert wird , Einheit kb. RES=CODE+DATA

    • T: SHR = (Shared Mem size (kb)) Shared Memory-Größe, Einheit kb

    • W : S = (Prozessstatus) Prozessstatus. D = ununterbrochener Schlafzustand, R = läuft, S = Schlaf, T = verfolgen/stoppen, Z = Zombie-Prozess

    • K: %CPU = (CPU Auslastung) Der Prozentsatz der seit der letzten Aktualisierung belegten CPU-Zeit

    • N: %MEM = (Speichernutzung (RES) ) Prozentsatz vom Prozess genutzter physischer Speicher

    • M: TIME+ = (CPU-Zeit, Hundertstel) Gesamte CPU-Zeit, die vom Prozess genutzt wird, Einheit 1/100 Sekunde
      b: PPID = (Parent Process Pid) Parent Process Id
      c: RUSER = (Echter Benutzername)
      d: UID = (User Id) Benutzer-ID des Prozesses Eigentümer
      f: GROUP = (Gruppenname) Der Gruppenname des Prozesses Eigentümer
      g: TTY = (Steuer-Tty) Der Terminalname des gestarteten Prozesses. Prozesse, die nicht vom Terminal aus gestartet werden, werden angezeigt als: = (Ausgelagerte Größe (KB)) Die Größe des vom Prozess verwendeten virtuellen Speichers, der ausgelagert wird, Einheit KB
      l: P = (CPU-Zeit) Die gesamte vom Prozess verwendete CPU-Zeit, Einheit Sekunden
      r: SWAP = (Codegröße (kb)) Die Größe des physischen Speichers, der vom ausführbaren Code belegt wird, in kb
      s: TIME = (Daten+Stackgröße (kb)) Der andere Teil als der ausführbare Code (Datensegment + Stapel) Größe des belegten physischen Speichers, Einheit KB
      u: CODE = (Anzahl der Seitenfehler) Anzahl der Seitenfehler
      v: DATA = (Anzahl der fehlerhaften Seiten) Das letzte Mal, dass in die Gegenwart geschrieben wurde, wurde geändert. Anzahl der Seiten
      y: nFLT = (Schlafende Funktion) Wenn der Prozess schläft, wird der Name der Systemfunktion im Ruhezustand angezeigt
      z: nDRT = (Task Flags ) Task Flags finden Sie unter sched.h
      WCHAN
      Flags Weitere Informationen finden Sie in der ausführlichen Erläuterung des Top-Befehls des Linux-Leistungsanalysetools

    • Führen Sie die PID top -Hp aus, z. B. top -Hp 15477
    • Threads in einem Prozess anzeigen COMMAND

      Hinweis: Zu diesem Zeitpunkt ist die PID die Thread-ID

Wenn es eine Ausnahme in Thread 15571 gibt und Sie diese überprüfen müssen, verwenden Sie jstack, um den Stapel zu drucken und den Status von Thread 15571 (15571 hexadezimal = 3cd3) zu überprüfen

2. jstack

Referenz Java-Befehl – ​​Jstack-Tool

 Java-Befehlslernserie (2) – Jstack

Muss gehen zu JDK Verwenden Sie es im Installationsverzeichnis (Sie können den Java-Prozess über ps Hexadezimal = 3cd3 anzeigen) Status

Analyse des Jstack-Protokolls:

Monitor Monitor:

Monitor ist das wichtigste Mittel in Java, um gegenseitigen Ausschluss und Zusammenarbeit zwischen Threads zu erreichen Objekt- oder Klassensperre.

Jedes Objekt hat nur einen Monitor.

Die folgende Abbildung beschreibt die Beziehung zwischen Threads und Monitoren sowie die Zustandsübergänge von Threads:

Entrt Set: Zeigt an, dass die Thread-Anfragen, um die Sperre des Objekts durch Synchronisierung zu erhalten. Wenn das Objekt gesperrt ist, geben Sie den Eigentümer ein; andernfalls warten Sie im Eingangsbereich. Sobald die Objektsperre von anderen Threads aufgehoben wird, nimmt sie sofort am Wettbewerb teil.

Der Besitzer: Zeigt an, dass ein Thread erfolgreich um die Objektsperre konkurriert hat.

Wait Set: Gibt an, dass der Thread die Sperre des Objekts über die Methode object.wait() des Objekts aufhebt und im Wartebereich darauf wartet, geweckt zu werden.

Wie Sie auf dem Bild sehen können, kann ein Monitor zu einem bestimmten Zeitpunkt nur einem Thread gehören, und dieser Thread ist <code><span style='font-family: "Microsoft YaHei"'>Active Thread</span>Aktiver Thread <span style='font-family: "Microsoft YaHei"'>Waiting</span> <span style='font-family: "Microsoft YaHei"'>Thread</span>, während andere Threads <code><span style='font-family: "Microsoft YaHei"'>Entry</span> <span style='font-family: "Microsoft YaHei"'>Set</span>Warten<span style='font-family: "Microsoft YaHei"'>Wait</span> <span style='font-family: "Microsoft YaHei"'>Set</span> Thread

bzw. in zwei Warteschlangen

Eintrag sind Warten Sie innerhalb von Set<code><span style='font-family: "Microsoft YaHei"'>Entry</span> <span style='font-family: "Microsoft YaHei"'>Set</span>

und Wait<code><span style='font-family: "Microsoft YaHei"'>Waiting for monitor entry</span>。 Set.

<span style='font-family: "Microsoft YaHei"'>Wait</span> <span style='font-family: "Microsoft YaHei"'>Set</span>Die Thread-Aktion, die in <code><span style='font-family: "Microsoft YaHei"'>in Object.wait()</span>Entry Set

wartet, ist <p>Warten auf Monitoreintrag<span style="color: #888888">. </span></p>

Die Thread-Aktion, die in

<strong>Wait</strong>

Set

wartet, ist in Object.wait(). Wenn ein Thread den Eintritt in den kritischen Abschnitt beantragt, gelangt er in die Eintragssatzwarteschlange.

(Wir nennen das durch synchronisiert geschützte Codesegment den kritischen Abschnitt. Wenn ein Thread beantragt, in den kritischen Abschnitt einzutreten, gelangt er in die Warteschlange „Entry Set“) Threadstatus:

NEU

: Nicht gestartet. Wird nicht im Dump angezeigt. RUNNABLE: Wird in der virtuellen Maschine ausgeführt und läuft im Status. Der Besitzerbereich

BLOCKIERT: Blockiert und wartet auf Monitorsperre. Warten Sie auf die Sperre im Bereich „Entry Set“ .

WATING: Warten auf unbestimmte Zeit darauf, dass ein anderer Thread einen bestimmten Vorgang ausführt.

Im Warte-Set-Bereich

warten Sie, bis eine bestimmte Bedingung oder Überwachung eintritt, und bleiben dabei normalerweise bei Anweisungen wie wait().

TIMED_WATING: Zeitlich begrenztes Warten auf eine bestimmte Operation von einem anderen Thread. Im Bereich

Wait

Set besteht der Unterschied zwischen und WAITING darin, dass wait() und andere Anweisungen ein Zeitlimit von wait(timeout) hinzufügen.

BEENDET

: Beendet. Aufrufänderung weist auf zusätzliche wichtige Vorgänge hin, wenn der Thread eine Methode aufruft. Ändern Sie den obigen Methodenaufruf.

gesperrt Ziel: Synchronisiert verwenden, um die Objektsperre erfolgreich zu beantragen, der Besitzer des Monitors. Der Eigentümerbereich.

Warten auf Sperre

Ziel: Antrag auf Objektsperre mit Synchronisierung war erfolglos,

Warten auf die Sperre im Eintragssatzbereich. Der Thread-Status lautet „Blockiert“

Warten auf

Ziel: Nach erfolgreicher Beantragung der Objektsperre mithilfe der Synchronisierung die Sperre aufheben,

auf die Sperre warten im Warte-Set-Bereich. Der Thread-Status ist WAITING oder TIMED_WATING

Parken zum Warten

Ziel: park() wird aufgerufen,

befindet sich im Wartebereich und wartet auf Erlaubnis.

(Park ist ein grundlegendes Thread-Blockierungsprimitiv, das keine Objekte über den Monitor blockiert.

Park: Geben Sie den Wartezustand ein, vergleichen Sie Durch Warten kann der Thread in den Wartezustand versetzt werden, ohne die Sperre zu erhalten, und durch Entparken aktiviert werden)

Thread-Aktion

Der Grund, warum der Thread-Status generiert wird.

runnable: Der Besitzerbereich, Status RUNNABLEin Object.wait(): Call wait(), Wait Set-Bereich, Status ist WAITING oder TIMED_WAITING, Warten auf Warten auf Monitoreintritt ändern: Warten auf Sperre, Eintragssatzbereich, Status BLOCKIERT, Warten auf Sperren ändernWarten auf Bedingung : Aufgrund bestimmter Bedingungen geparkt, Wartebereich festgelegt, Status ist „Parken zum Warten“Schlafen: Schlafender Thread, genannt Thread.sleep()

Zusammenfassung

1. Überprüfen Sie den Thread-Dump. Sehen Sie sich zunächst den Thread-Status/die Thread-Aktion an (intuitiver). Sie können feststellen, in welcher Phase sich der Thread derzeit befindet. Schauen Sie sich dann die Anrufänderung und den Sperrstatus an. Sie können grundsätzlich feststellen, ob ein Problem mit dem sekundären Thread vorliegt.

2. Sie können Thread-Snapshots in einem kurzen Zeitraum (dem Zeitraum, in dem) mehrmals gedruckt werden (es kann ein Problem geben) und dann prüfen, ob ein Problem vorliegt. Diese Situation eines bestimmten Threads kann das Problem effektiv finden.

3. jps

Ähnlich dem Linux-Befehl ps

Referenz Java-Befehlslernreihe (1) - Jps

./jps

./jps -q

./jps -m

./jps -l

./jps -v

4. jmap

Referenz : Java-Befehlslernreihe (3) - Jmap

java command--jmap command use

jmap -heap PID: Heap-Nutzung

jmap -histo PID: Objektsituation

(jmap -histo:live Dieser Befehl wird ausgeführt, die JVM löst zuerst gc aus und sammelt dann statistische Informationen

Konzentrieren Sie sich auf die Klassen im Projekt: [C ist ein String-Array, String wird verwendet; [B ist ein Byte-Array, das von der Netzwerkschicht verwendet wird. Es spielt keine Rolle, ob diese beiden größer sind

 [C ist ein Zeichen[]
 [S ist ein Short[ ]
 [I ist ein Int[]
 [B ist ein Byte[]
 [ [Ich bin ein int[] []

Zusammenfassung: Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Lernen aller hilfreich sein. Weitere verwandte Tutorials finden Sie unter Java-Video-Tutorial, Java-Entwicklungsgrafik-Tutorial, Bootstrap-Video-Tutorial!

Das obige ist der detaillierte Inhalt vonSo verwenden Sie JVM-Befehle in Java zur Fehlerbehebung bei Servern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:cnblogs.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage