この記事では、Java で JVM コマンドを使用してサーバーのトラブルシューティングを実装する方法を紹介します。困っている友人は参考にしていただければ幸いです。
top コマンドを実行します: (以下で使用されるプロセス 15477 の詳細を参照)
システム情報 (最初の 5 行):
行 1: 上位タスク キュー情報 (システムの実行ステータスと平均負荷)、稼働時間と同じコマンド結果。
平均システム負荷: シングルコア CPU の場合、0.00 は負荷なし、1.00 は完全負荷のみ、1 を超えると過負荷を意味します。理想的な値は 0.7、
マルチコア CPU 負荷: CPU コアの数 * 理想値 0.7 = 理想的な負荷、たとえば、4 コア CPU 負荷は 2.8 を超えません。高負荷はありません。
段落 2: 実行中のプロセスの数、例: 1 running,
段落3: スリープ状態のプロセスの数、例: 230 スリープ状態、
段落 4: 停止したプロセスの数、例: 0 停止、
段落 5: ゾンビ プロセスの数、例: 0 ゾンビ
ユーザー スペースが占有する CPU の割合 たとえば、 : Cpu (s): 12.7%us, 段落 2:
#段落 3:
ni
4 番目のセクション:
id
セクション 5:
wa
段落 6:
hi
段落 7:
si
##段落 8 : st
スチール時間 ハイパーバイザーによって仮想マシンから盗まれた CPU 時間 (仮想マシンが現在ハイパーバイザーの下にある場合、ハイパーバイザーは実際に CPU 処理時間の一部を消費します)
行 4:
段落 1: 物理メモリの合計量、例: Mem: 12196436k total,
段落 1: スワップ領域の合計量 (例: Swap: 2097144k total,
##A:
PID
= (プロセス ID) プロセス ID; E: USER
= (ユーザー名) プロセス所有者のユーザー名。
H: PR
= (優先度) 優先度
I: NI
= (いい値) いい価値。負の値は優先度が高いことを表し、正の値は優先度が低いことを表します
O: VIRT
= (仮想イメージ (kb))プロセス使用量 仮想メモリの総量、単位 kb。 VIRT=SWAP RES
Q: RES
= (常駐サイズ (kb)) プロセスによって使用され、スワップアウトされなかった物理メモリサイズ、単位はkb。 RES=CODE DATA
T: SHR
= (共有メモリ サイズ (kb)) 共有メモリ サイズ、単位 kb
W: ##S = (プロセスステータス) プロセスステータス。 D=無中断スリープ状態、R=実行中、S=スリープ、T=追跡/停止、Z=ゾンビプロセス
K: % CPU = (CPU 使用率) 前回の更新以降の CPU 時間使用率の割合
N: %MEM = (メモリ使用量 (RES)) プロセスによって使用される物理メモリの割合
= (CPU 時間、100 分の 1) ) プロセスによって使用される合計 CPU 時間、単位 1/100 秒 b:
PPID
= (親プロセス Pid) 親プロセス ID c:
RUSER
= (実数)ユーザー名) d:
UID
= (ユーザー ID) プロセス所有者のユーザー ID f:
GROUP
= (グループ名) プロセスのグループ名owner g:
TTY
= (制御 Tty) 起動プロセスの端末名。ターミナルから開始されていないプロセスは、? j:
P
= (最後に使用された CPU (SMP)) として表示されます。最後に使用された CPU は、マルチ CPU 環境でのみ意味を持ちます。 : SWAP
= (スワップ サイズ (kb)) スワップアウトされるプロセスによって使用される仮想メモリのサイズ (kb
l): TIME
= (CPU 時間)プロセスによって使用される CPU 合計時間 (秒単位)
r: CODE
= (コード サイズ (kb)) 実行可能コードによって占有される物理メモリ サイズ (kb 単位)
s: DATA
= ( データ スタック サイズ (kb)) 実行コード以外の部分 (データ セグメント スタック) が占有する物理メモリのサイズ、単位 kb
u: nFLT
= (ページ フォールトcount) ページ フォールトの数
v: nDRT
= (ダーティ ページ カウント) 最後に書き込まれてから変更されたページの数
y: WCHAN
= (関数のスリープ中) プロセスがスリープ状態の場合、スリープ中のシステム関数名を表示します
z: Flags
= (タスク フラグ
#注: ここでは、 PID はスレッド ID です
スレッド 15571 に例外があり、それを確認する必要がある場合は、jstack を使用してスタックを出力し、スレッドのステータスを確認します。 15571 (15571 16 進数 = 3cd3)
## 2. jstack リファレンス Java コマンド -- jstack ツール
Java コマンド学習シリーズ(2)-Jstack
これを使用するには、JDK インストール ディレクトリに移動する必要があります (ps x を通じて Java プロセスを表示し、jdk インストール ディレクトリを取得できます) ./jstack PID (プロセス ID) ./jstack 15477 赤いボックスはスレッド 15571 (16 進数 = 3cd3) ステータスjstack ログを分析します:
Monitor モニター: モニターは、Java においてスレッド間の相互排他と協調を実現するための主要な手段であると考えられます。オブジェクトまたはクラス ロックとして。 すべてのオブジェクトにはモニターが 1 つだけあります。
次の図は、スレッドとモニターの関係と、スレッドの状態遷移を示しています。
Enter Set:スレッドが同期を通じてオブジェクトのロックを取得することを要求していることを示します。オブジェクトがロックされている場合は、所有者を入力します。それ以外の場合は、入力領域で待機します。オブジェクトのロックが他のスレッドによって解放されると、そのスレッドはすぐに競合に参加します。Owner (所有者): スレッドがオブジェクト ロックの競合に成功したことを示します。
Wait Set: スレッドがオブジェクトの object.wait() メソッドを通じてオブジェクトのロックを解放し、ウェイクアップされるまで待機領域で待機することを示します。
図からわかるように、モニターは特定の時点で 1 つのスレッドのみが所有でき、そのスレッドは <span style='font-family: "Microsoft YaHei"'>アクティブ スレッド</span>
、他のスレッドはそれぞれ 2 つのキュー <span style='font-family: "Microsoft YaHei"'>Entry</span> ## で <span style='font-family: "Microsoft YaHei"'></span>Waiting
Thread<span style='font-family: "Microsoft YaHei"'></span> になっています。 #Set<span style='font-family: "Microsoft YaHei"'></span> と
Wait<span style='font-family: "Microsoft YaHei"'> </span>Set<span style='font-family: "Microsoft YaHei"'></span> 内で待機します。
#Entry <span style='font-family: "Microsoft YaHei"'>Set</span><span style='font-family: "Microsoft YaHei"'></span> で待機しているスレッド アクションは
モニターのエントリーを待っています。 <span style='font-family: "Microsoft YaHei"'></span>
Wait <span style='font-family: "Microsoft YaHei"'>Set</span><span style='font-family: "Microsoft YaHei"'></span> で待機しているスレッド アクションは
Object.wait()<span style='font-family: "Microsoft YaHei"'></span> 内。
スレッドがクリティカル セクションへの参加を申請すると、スレッドはエントリ セット キューに入ります。 <span style='font-family: "Microsoft YaHei"'></span>
スレッドのステータス:
NEW: 開始されていません。ダンプには表示されません。
RUNNABLE: 仮想マシンで実行され、実行状態になります。 オーナーエリア
BLOCKED: ブロックされており、モニターのロックを待機しています。 エントリーセットエリアでロックを待っています。
WATING: 別のスレッドが特定の操作を実行するまで無期限に待機します。 「待機セット」領域で特定の条件またはモニターが発生するまで待機します。通常は wait() などのステートメント内に留まります。
TIMED_WATING: 別のスレッドからの特定の操作を時間制限付きで待機します。 Wait Set 領域で、 と WAITING の違いは、wait() および他のステートメントが wait(timeout) の時間制限を追加することです。
終了: 終了しました。 呼び出し変更
ターゲット: synchronized を使用して、オブジェクト ロックを正常に適用します (モニターの所有者)。 オーナーエリア。 waiting to lock
Target: 同期を使用したオブジェクト ロックのアプリケーションが失敗しました。エントリ セット領域でロックを待機しています。スレッドのステータスは Blockedwaiting on
目標: synchronized を使用してオブジェクト ロックを正常に適用した後、ロックを解放し、ロックが完了するまで待ちます。待機セット領域。スレッドのステータスは WAITING または TIMED_WATINGparking to wait for
ターゲット: park() が呼び出され、 は待機セット領域にあり、待機中です。許可。 (park は、モニターを介してオブジェクトをブロックしない基本的なスレッド ブロック プリミティブです。
park: WAITING 状態に入り、比較しますwait は、ロックを取得せずにスレッドを WAITING にし、パーク解除によってウェイクアップすることができます)
スレッド アクション
: Object.wait() の Owner 領域、ステータス RUNNABLE
: wait() を呼び出し、Wait Set 領域、ステータスは次のとおりです。 WAITING または TIMED_WAITING、待機中を変更します
監視エントリの待機中: ロック待機中、エントリ セット領域、ステータス BLOCKED、ロック待機中を変更します
待機中条件: 特定の条件により駐車中、待機セット領域、ステータスは待機中です。
sleeping: Thread.sleep() と呼ばれるスリープ状態のスレッド 1. まずスレッド ステータス/スレッド アクションを確認して (より直感的)、スレッドが現在どの段階にあるかを確認します。次に、呼び出しの変更とロックのステータスを確認すると、基本的にセカンダリ スレッドに問題があるかどうかを判断できます。問題がある可能性があります)、考えられる問題を確認してください。特定のスレッドのこの状況により、問題を効果的に見つけることができます。 3. jps 参考 Java コマンド学習シリーズ (1) - Jps ./jps ./jps -q ./jps -m ./jps -l ./jps -v ## 4. jmap [S は short[] [I は int[]概要
Linux コマンド ps と同様
[B は byte[]
[[I is a int[] []
概要: 上記がこの記事の全内容です。その他の関連チュートリアルについては、# を参照してください。 ##Java ビデオ チュートリアル 、##。 #Java 開発グラフィック チュートリアル
、ブートストラップ ビデオ チュートリアル !
以上がJava で JVM コマンドを使用してサーバーのトラブルシューティングを行う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。