JVM監視ツール--jstack

[記事]参考:jstackコマンド体験

1.はじめに

  jstack主に現在の瞬間スレッドのJava仮想マシンのスナップショットを生成するために使用されます。

  スナップショットは、現在のスレッドのJava仮想マシンの各実行中のスレッド・スタック・コレクション方法であります

  主な目的は、スレッドが発生し配置することであるため、このような等スレッド間のデッドロック、無限ループ、外部リソースを待っている長い時間の要求をもたらす限り、一時停止、

2.基本的な使い方

  

 2.1 jstack <PID>

  情報のプロセスの出力電流スレッド時間のスナップショット。

  一般的には3つの部分に分かれ:

  最初の部分は、JVMの現在時刻情報と情報のスナップショットです。

  例:

    

   複数のスレッドの実装の第二の部分、我々は、例として選択スレッド分析。

  例:

    

     メイン:スレッド名。

    PRIO:スレッドの優先度。

    os_prio:スレッドの優先度。

    TID:スレッドID。

    NID:LinuxシステムPIDにマッピングされた軽量プロセスは、進数とスナップショットは、小数点以下はシステムに見えるように変換することができます。

  現在のアクションスレッド:  

    典型的には、各スレッドダンプの最初の行の最後に記録。

    Runnableを:CPUパラメータは、実行するようにスケジュールされる可能性が高い、競争の中でスレッドを表してもすぐに待機している可能性があり、

    睡眠は:のThread.sleep()は、スレッドがスリープ状態になることを示します。

    条件条件待ち[... 0xの]用ONスレッドがされていることを示しているブロックされたプリミティブブロックされ、角括弧内のアドレスを示すリソースが待機中のスレッドに対処し、これとビルトインJDK5後java.utilのあるロックシステム、JVMの間には関係がありませんパケットにロック機構.concurrent.locks.Condition。

    待っているモニターのエントリのために[... 0xのは]:スレッド表して構築されたロック取得しようとする試み待合室エントリーセット、角括弧内のアドレスは、リソースを待っているスレッドのアドレスを示しているが、

    ()内はObject.waitは[0xの...] :)スレッドが(はObject.waitを呼び出し表し、内蔵のロックあきらめ、起こされるのを待って、待合室には設定を待って入った角括弧内のアドレスがリソースを放棄するスレッドのアドレスを示し、 ;

  Thread.State:  

    RUNNABLE:これは通常、実行可能なスレッドのアクションと一緒に発生します。

    (オブジェクトのモニタ上)BLOCKED:モニタエントリを待っているスレッドのこの一般的な動作は一緒に表示され、キーワードまたはシンクブロック同期種々の変形が可能であるように、呼が、その糸の固定方法を最端スタックありません。

    または(オブジェクトモニター上)TIMED_WAITING(オブジェクトモニター上)WAITING:)はObject.waitで、この一般的なスレッドアクション([0X ...]一緒に表示され、スレッドのほとんどのエンドは、メソッド呼び出しスタックはjava.langのである呼び出します。 Object.wait(ネイティブメソッド)、そのはObject.wait()メソッドを呼び出しを示します。

      さらに、WAITING TIMED_WAITING差は区別)、すなわち(長いタイムアウト)を待って(待って、設定されたタイムアウトが中断するかどうかです。

    (パーキング)またはTIMED_WAITING(パーキング)WAITING:状態で待機中、通常、この操作スレッドを[0xの...]ネイティブメソッド(sun.misc.Unsafe.parkで一般的に一緒に表示され、最端スレッドコールスタックの呼び出し方法);

      スレッドブロックが、java.util.concurrent.locks.AbstractQueuedSynchronizerクラスで主に使用されるプリミティブUnsafe.park使用され、多くのAQSは、ReentrantLockの、条件、たCountDownLatch、他にセマフォスレッドとして基づいて同期ツールは、誘導する構築します状態;

      さらに、上述三点TIMED_WAITING差の理由と一致待ち。

  重要なスレッドは、修正を呼び出します。

    スレッドのコールスタックのスレッドダンプ、このアクションとスレッドの状態のフォーカスが密接に関連しているとして、一般的には、一般的に、それは次のカテゴリに分けることができ、追加の変更の形でロックに関連した状態のリソースを使用します。

    ロック<0xの...>は、それが成功した組み込みのロック取得し、所有者になるために。

    駐車場待ち<0xの...>に、それは言われたプリミティブを遮断することによってブロックされ、通常の状態で待機しているスレッドのアクションと一緒に表示されます。

    <0xの...>を待っているにロックし、言ったそのエントリーセット内での組み込みのロック待ち、通常はモニタエントリと移動スレッドを待ってまとめて表示されます。

    ウェイティング<0xの...> ON待ちセット表し、起こされるのを待っているが、一般的にはObject.wait()で操作をスレッド[0xの...]が一緒に表示されます。

  第三の部分JVMレベル情報

  例:

    

 

     VMのスレッド:仮想マシンのスレッド。

    VM定期的なタスクスレッド:仮想マシンのタスクスレッド。

    JNIグローバル参照:JNIグローバル参照番号。

2.2 jstack -F -m -l <​​PID>

  -F:印刷プロセスが応答しない場合、スタック情報を強制します。

  -m:JavaとネイティブC、情報のC ++スタックを印刷します。

  -l:ロックに関する追加情報を出力します

  デッドロックを検出します-F -mパラメータを使用する場合は、スレッドダンプ印刷された情報は、以下の情報が含まれます:

  

 

   -lオプションを使用する場合は、出力電流のスレッドは、アドレスの種類ではなくなしなどのショーのロックを保持しています:

  

  

おすすめ

転載: www.cnblogs.com/virgosnail/p/11514609.html