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.
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: sy
Kernel-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 WCHAN
Flags
Weitere Informationen finden Sie in der ausführlichen Erläuterung des Top-Befehls des Linux-Leistungsanalysetools
Threads in einem Prozess anzeigen COMMAND
2. jstack
Referenz Java-Befehl – Jstack-ToolJava-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
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
<p>Warten auf Monitoreintrag<span style="color: #888888">. </span></p>
Die Thread-Aktion, die in <strong>Wait</strong>
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.
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
WaitSet 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
Warten auf Sperre
Ziel: Antrag auf Objektsperre mit Synchronisierung war erfolglos, Warten auf die Sperre im Eintragssatzbereich. Der Thread-Status lautet „Blockiert“Warten auf
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()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.
Ähnlich dem Linux-Befehl ps
Referenz Java-Befehlslernreihe (1) - Jps
./jps
./jps -q
./jps -m
./jps -l
./jps -v
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!