ホームページ  >  記事  >  Java  >  Java で JVM コマンドを使用してサーバーのトラブルシューティングを行う方法

Java で JVM コマンドを使用してサーバーのトラブルシューティングを行う方法

青灯夜游
青灯夜游転載
2018-10-17 15:28:302477ブラウズ

この記事では、Java で JVM コマンドを使用してサーバーのトラブルシューティングを実装する方法を紹介します。困っている友人は参考にしていただければ幸いです。

1. top (Linux コマンド)

top コマンドを実行します: (以下で使用されるプロセス 15477 の詳細を参照)

システム情報 (最初の 5 行):

    • 行 1: 上位タスク キュー情報 (システムの実行ステータスと平均負荷)、稼働時間と同じコマンド結果。

      • 平均システム負荷: シングルコア CPU の場合、0.00 は負荷なし、1.00 は完全負荷のみ、1 を超えると過負荷を意味します。理想的な値は 0.7、

      • マルチコア CPU 負荷: CPU コアの数 * 理想値 0.7 = 理想的な負荷、たとえば、4 コア CPU 負荷は 2.8 を超えません。高負荷はありません。

      • #形式: xx 日まで、HH:MM

      • 例: 241 日、20:11 を意味します。連続 241 日、20 時間 11 分実行

      • セクション 1: システムの現在時刻、例: 16:07:37

      • 段落 2: システムの実行時間、再起動までの時間。時間が長いほど、システムはより安定します。


      • #段落 3: 現在ログインしているユーザーの数。例: 1 ユーザー。現在ログインしているユーザーが 1 人だけであることを示します
      • 段落 4 セグメント: システム負荷、つまりタスク キューの平均長。3 つの値はそれぞれ、過去 1 分間、5 分間、および 15 分間の平均システム負荷をカウントします。

      • # 行 2: タスク プロセス関連情報

    • 段落 1: プロセスの合計数 (例: タスク) : 合計 231、合計 231 のプロセスが実行されていることを示します
      • 段落 2: 実行中のプロセスの数、例: 1 running,

      • 段落3: スリープ状態のプロセスの数、例: 230 スリープ状態、

      • 段落 4: 停止したプロセスの数、例: 0 停止、

      • 段落 5: ゾンビ プロセスの数、例: 0 ゾンビ

      • 行 3: CPU CPU 関連情報 マルチコア CPU の場合は、数字の 1 を押します。このとき、1行目はCPUコア番号行に変換され、番号1を前後に切り替えることができます。

    • 段落 1:
      • us

        ユーザー スペースが占有する CPU の割合 たとえば、 : Cpu (s): 12.7%us, 段落 2:

        sy
      • カーネル空間が占有する CPU の割合 (例: 8.4%sy,##)
      • #段落 3: ni

        ユーザー プロセス空間内で優先順位が変更されたプロセスによって占有される CPU の割合 (例: 0.0%ni,
      • )

        4 番目のセクション: id

        アイドル状態の CPU の割合 (例: 77.1%id,
      • セクション 5: wa

        割合)入力と出力を待機している CPU 時間。例: 0.0%wa,
      • 段落 6: hi

        CPU がハードウェア割り込みを処理するのに費やした合計時間。例: 0.0%hi,
      • 段落 7: si

        CPU サービスのソフト割り込みに費やされた合計時間、例: 1.8%si,
      • ##段落 8 : st スチール時間 ハイパーバイザーによって仮想マシンから盗まれた CPU 時間 (仮想マシンが現在ハイパーバイザーの下にある場合、ハイパーバイザーは実際に CPU 処理時間の一部を消費します)

      • 行 4:

        Mem メモリ関連情報
      (Mem: 合計 12196436k、使用済み 12056552k、空き 139884k、バッファー 64564k)
    • 段落 1: 物理メモリの合計量、例: Mem: 12196436k total,

      • 段落 2: 合計使用されている物理メモリの量、例: 12056552k used,
      • セクション 3: 合計空きメモリ、例: Mem: 139884k free、
      • セクション 4: カーネルとして使用 キャッシュされたメモリの量、例: 64564k バッファ
      • 行 5: スワップ スワップ パーティション関連情報 (スワップ: 合計 2097144k、使用済み 151016k、 1946128k 空き、3120236k キャッシュ)

    • 段落 1: スワップ領域の合計量 (例: Swap: 2097144k total,

    • )
        段落 2: 使用済みスワップ領域の合計量、例: 151016k used,
      • セクション 3: 空きスワップ領域の合計量、例: 1946128k free、
      • # セグメント 4: 合計バッファー スワップ領域、キャッシュされた 3120236k
      • #プロセス情報:
    上部のコマンドを押します。 f を押して表示された列情報を表示し、対応する文字を押して列をオン/オフにします。大文字はオンを意味し、小文字はオフを意味します。 * のマークが付いている列はデフォルトの列です。

##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)) プロセスによって使用される物理メモリの割合

    • ##M:
    • TIME

      = (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 = (タスク フラグ ) タスク フラグ。「」を参照してください。 sched.h

      X:
    • COMMAND
    • = (コマンド名/行) コマンド名/コマンド行

      #リファレンス Linux パフォーマンス分析ツールのトップ コマンドの詳細な説明
    top -Hp 15477 などの top -Hp PID を実行します
#プロセス内のスレッドを表示します

#注: ここでは、 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) の時間制限を追加することです。

終了

: 終了しました。 呼び出し変更

スレッドがメソッドを呼び出すときの追加の重要な操作を示します。上記のメソッド呼び出しを変更します。

locked

ターゲット: synchronized を使用して、オブジェクト ロックを正常に適用します (モニターの所有者)。 オーナーエリア。

waiting to lock

Target: 同期を使用したオブジェクト ロックのアプリケーションが失敗しました。エントリ セット領域でロックを待機しています。スレッドのステータスは Blocked

waiting on

目標: synchronized を使用してオブジェクト ロックを正常に適用した後、ロックを解放し、ロックが完了するまで待ちます。待機セット領域。スレッドのステータスは WAITING または TIMED_WATING

parking to wait for

ターゲット: park() が呼び出され、 は待機セット領域にあり、待機中です。許可。

(park は、モニターを介してオブジェクトをブロックしない基本的なスレッド ブロック プリミティブです。

park: WAITING 状態に入り、比較しますwait は、ロックを取得せずにスレッドを WAITING にし、パーク解除によってウェイクアップすることができます)

スレッド アクション

スレッド ステータスが生成される理由。

runnable

: Object.wait() の Owner 領域、ステータス RUNNABLE

: wait() を呼び出し、Wait Set 領域、ステータスは次のとおりです。 WAITING または TIMED_WAITING、待機中を変更します

監視エントリの待機中

: ロック待機中、エントリ セット領域、ステータス BLOCKED、ロック待機中を変更します

待機中条件

: 特定の条件により駐車中、待機セット領域、ステータスは待機中です。

sleeping

: Thread.sleep() と呼ばれるスリープ状態のスレッド

概要

1. まずスレッド ステータス/スレッド アクションを確認して (より直感的)、スレッドが現在どの段階にあるかを確認します。次に、呼び出しの変更とロックのステータスを確認すると、基本的にセカンダリ スレッドに問題があるかどうかを判断できます。問題がある可能性があります)、考えられる問題を確認してください。特定のスレッドのこの状況により、問題を効果的に見つけることができます。

3. jps

Linux コマンド ps と同様

参考 Java コマンド学習シリーズ (1) - Jps

./jps

./jps -q

./jps -m

./jps -l

./jps -v

## 4. jmap

参考: Javaコマンド学習シリーズ(3) - Jmap

javaコマンド--jmapコマンドの使い方

jmap -heap PID: ヒープの使用状況

jmap -histo PID: オブジェクト 状況

(jmap -histo:live このコマンドが実行されると、JVM は最初に gc をトリガーし、次に統計情報を収集します。

プロジェクトのクラスに注目します。 [C は文字列配列であり、文字列が使用されます。[B はネットワーク層で使用されるバイト配列です。この 2 つが大きいかどうかは問題ではありません。[C は char[]

です。

[S は short[]

[I は int[]
[B は byte[]
[[I is a int[] []
概要: 上記がこの記事の全内容です。その他の関連チュートリアルについては、# を参照してください。 ##Java ビデオ チュートリアル 、##。 #Java 開発グラフィック チュートリアル
ブートストラップ ビデオ チュートリアル !

以上がJava で JVM コマンドを使用してサーバーのトラブルシューティングを行う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。