この記事では、JVMのスレッドスタックを分析する方法と、スタック情報から問題の根本原因を見つける方法を教えます。私の意見では、スレッドスタック分析テクノロジーは、Java EE製品サポートエンジニアが習得しなければならない技術です。スレッドスタックに保存されている情報は、通常、この情報をはるかに超えています。
私の目標は、過去10年間にわたってスレッド分析に蓄積された知識と経験を共有することです。これらの知識と経験は、JVMのさまざまなバージョンとさまざまなメーカーのJVMサプライヤーの詳細な分析で得られます。
それで、あなたは準備ができていますか、この記事は次の数週間で、この一連の特別な記事をお届けします。何を待っていますか、急いでこのスレッド分析トレーニング計画を同僚や友人と共有してください。
それは本当にいいですね。
私の提案は、このスレッド分析トレーニング計画を完了するために私に従うことです。これが私たちがカバーするトレーニングコンテンツです。同時に、私が皆がすべての人と学び、理解するために私が扱った実際のケースをあなたと共有します。
1)スレッドスタックと基本知識の概要
2)スレッドスタックの原則と関連ツール
3)異なるJVMスレッドスタックフォーマット(Sun Hotspot、IBM JRE、Oracal JRockit)
4)スレッドスタックログの紹介方法と分析方法
5)スレッドスタックと関連技術の分析
6)一般的な問題テンプレート(スレッド、デッドロック、死の死、ゴミリサイクル/OutofMemoryError問題、デッドサイクルなど)
7)たとえば、スレッドスタックの問題の分析
この一連のトレーニングがあなたに真のヘルプをもたらすことを願っていますので、毎週の記事の更新に注意を払い続けてください。
しかし、調査プロセスに質問がある場合、または記事のコンテンツが理解できない場合はどうすればよいですか?
心配しないでください、私をあなたのメンターとして扱ってください。スレッドスタックに関する質問はあります(問題が低くなることはない場合)。私と連絡するための次の方法を選択してください:
1)この記事で直接コメントした(ごめんなさい場合、匿名になることができます)
2)スレッドスタックデータを根本原因分析フォーラムに送信する
3)メールを送ってください、アドレスは@[email protected]です
私たちの製品で発生した問題を分析するのを手伝ってもらえますか?
もちろん、あなたが喜んでいるなら、あなたは私に郵便またはフォーラムのルートケープ分析フォーラムを通してあなたのスタックライブデータを送ることができます。実際の問題は、スキルを向上させる学習の王です。
誰もがこのトレーニングを気に入ってくれることを本当に願っています。だから私はあなたに高品質の資料を提供し、あなたのさまざまな質問に答えるために最善を尽くします。
スレッドスタック分析テクノロジーと問題モデルを導入する前に、まず基本コンテンツを伝える必要があります。そのため、この投稿では、JVM、ミドルウェア、Java EEコンテナ間の相互作用を誰もがよりよく理解できるように、最も基本的なコンテンツをカバーします。
Java VMの概要
Java仮想マシンは、Jave EEプラットフォームの基礎です。ミドルウェアとアプリケーションが展開および実行される場所です。
JVMは、ミドルウェアソフトウェアとJava/Java EEプログラムに次のことを提供します。
(バイナリ形式)Java / Java EEプログラム環境いくつかのプログラム機能特性とツール(IOインフラストラクチャ、データ構造、スレッド管理、セキュリティ、監視など)。
ゴミ回復の助けを借りて、動的メモリの割り当てと管理
JVMは、多くのオペレーティングシステム(Solaris、AIX、Windowsなど)にとどまることができ、物理的なサーバーに複数のJVMプロセスをインストールしてから、物理的なサーバーに複数のJVMプロセスをインストールできます。
JVMとミドルウェア間の相互作用
次の図は、JVM、ミドルウェア、アプリケーションの間の高層インタラクティブモデルを示しています。
図に表示されているJVM、ミドルウェア、アプリの間のいくつかのシンプルで典型的な相互作用。ご覧のとおり、標準のJava EEアプリケーションのスレッドの割り当ては、中央部とJVMのコア間で完了します。 (もちろん、例外があります。アプリケーションはAPIを直接呼び出してスレッドを作成できます。このアプローチは一般的ではなく、使用中に注意する必要があります)
同時に、いくつかのスレッドはJVMによって管理されています。
ほとんどのスレッド分布はJava EEコンテナによって行われるため、スレッドスタックの追跡を理解して理解することが重要ですリクエストは、Java EEコンテナを実行しようとしています。
スレッドストレージスタックの分析の観点から見ると、JVMから発見されたスレッドプールの違いを理解し、リクエストのタイプを特定できるようになります。
最後のセクションでは、HotSop VのJVMスレッドスタックの概要を提供します。
基本的な理由から、この記事のスレッドスタックの例を取得できることに注意してください。
JVMスレッドスタック - それは何ですか?
JVMスレッドスタックは、作成されたすべてのJavaスレッドの完全なリストを提供できる特定のタイムスナップショットです。
見つかったすべてのJavaスレッドは、次の情報を提供します。
スレッドの名前。ミドルウェアメーカーは、スレッドのロゴを識別するためによく使用されます。
スレッドタイプと優先度:デーモンPrio = 3 **ミドルウェアプログラムは、一般に、バックグラードの形でスレッドを作成します。 Java EEアプリケーションへ**
Tid = 0x000000011E52A800 **などのJavaスレッドID。
NID = 0x251CなどのネイティブスレッドIDは、ネイティブスレッドIDを使用すると、オペレーティングシステムの観点から得られるためです。
Javaスレッドのステータスと詳細情報:モニターエントリ[0xffffffffea5afb000] java.lang.thread.state:block(on object Monitor)などの詳細情報
**スレッドステータスが現在ブロックされている可能性のある理由をすぐに理解できます**
Java Stack Trackingは、これまでのスレッドスタックから最も重要なデータです多くのタイプの問題の原因、必要な情報の90%。
Java Stackメモリ分解。ホットスポットVM 1.6バージョンから始まり、Javaのスタックメモリ(Younggen、Oldgen)&Permgen Spaceなど、スレッドスタックの端でメモリ使用が表示されます。この情報は、頻繁なGCSによって引き起こされる問題を分析する場合に非常に便利です。既知のスレッドデータまたはモードを使用して、迅速なポジショニングを作成できます。
Heappsynggen合計466944K、178734K [0xffffffffffff70800000、0xfffffffffff70800000)Eden Space 233472K、76%使用F45c00000、0xffffffffffifffffiffiffiffiffifffif fffffffffff62400000、0xffffffff62400000,0xffffffffff70800000)e 233472k、0%userd [0xffffffffffffffffff54000000 、0xffffffffff62400000)psoldgen合計1400832k、1400831k [0xfffffffffef0400000、0xffffffffffff45c00000) C00000)PSPERMGEN合計262144K、248475K、0xffffffee0400000、0xffffffffffff0400000)オブジェクトスペース262144k、94%使用[0xffffffffed0400000 、0xfffffedf6f08,0xffffffffffee0400000)
スレッドスタック情報の大きな分解
誰もがよりよく理解できるようにするために、次の写真がこの写真で提供されています。
上の図では、スレッドスタックが複数の異なる部分で構成されていることがわかります。この情報は問題の分析に重要ですが、異なる問題モードの分析では異なる部分が使用されます(問題モードは後の記事でシミュレートして実証します)。
次に、この分析の例を通じて、スレッドスタック情報のホットスパーのコンポーネントを詳細に説明します。
#フルスレッドダンプ
「フルスレッドダンプ」は、グローバルのみのキーワードです。ミドルウェアの出力ログで、javaスレッドスタック情報のアローンバージョン(たとえば、unix:kill -3 <pid>)を使用できます。これは、スレッドスタックスナップショットの始まりです。
フルスレッドダンプJavaホットスポット(TM)64ビットサーバーVM(20.0-B11混合モード):
#Java EEミドルウェア、サードパーティ、およびカスタムアプリケーションソフトウェアのスレッド
この部分は、スレッドスタック全体のコア部分であり、通常は時間を分析する必要がある部分でもあります。ミッドラインのスタックの数は、使用するミドルウェア、3番目のパーティライブラリ(独立したスレッドがある場合があります)、およびアプリケーションに依存します(カスタムスレッドを作成する場合、これは通常良い練習ではありません)。
スレッドスタックの例では、WebLogicは使用するミドルウェアです。 Weblogic 9.2から始めて、あなたはによって管理できる一意のスレッドプールを使用します」
「[スタンバイ] executethRead: '414' for queue: 'weblogic.kernel.default(self-tuning)' "daemon prio = 3 tid = 0x000000010916a800 nid = 0x2613 in object .wait()[0xffffffffffe9edff000状態:java.lang.object.waitの待機(オブジェクトモニター)(ネイティブメソッド) - ウェブロジック。 work.work.cutethread.waitforrequest(executethread.java:160)-locked <0xffffffffffff27d44de0>(a weblogic.work.executetethread)c.work.executethread.run(execurethread.java:181)
#ホットスポットVMスレッド
これは、内部操作のネイティブ操作のためにHotspot VMによって管理される内部スレッドです。一般的に、(関連するスレッドスタックとPRSTATまたはネイティブスレッドIDを介して)がない限り、高いCPU職業率を見つけない限り、これについてあまり多くのことをする必要はありません。
「VM定期的なタスクスレッド」prio = 3 Tid = 0x0000000101238800 nid = 0x19
#Hotspot GCスレッド
並列GCにホットスポットを使用する場合(現在は複数の物理コアの環境で一般的です)、デフォルトで作成されたホットスポットVM、または各JVMがこれらのGCスレッドを使用してGCスレッドを管理する場合。定期的なGCクリーンアップは、GC時間の全体的な削減を引き起こします。
「GCタスクスレッド#0(Parallelgc) "prio = 3 tid = 0x0000000100100120000 nid = 0x3 runnable" gcタスクスレッド#1(parallelgc) "prio = 3 tid = 0x0000131000 nid = 0x444 runnable……………………………………………… ………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………かいより.. ………………………………………………………
これは重要なデータです。なぜなら、GCに関連する問題に関連する問題が過剰なGCやメモリリークなどに遭遇した場合、これらのスレッドのネイティブID値に関連付けられたオペレーティングシステムまたはJavaスレッドを使用してから、権利を見つけることができるため右のCPI時間の職業。
#JNIグローバルリファレンスカウント
JNI(Java Local Interface)のグローバルな参照は、Java Garbage Collectorによって管理されるJavaオブジェクトの基本的なオブジェクトに至ることですごみ収集。
同時に、JNI関連のリークを検出するためのJNI参照にも注意を払うことが重要です。
JNIグローバル参照:1925
#Javaスタックビューを使用します
これらのデータはJDK 1.6に追加され、Hotspotスタックの短くて速いビューを提供しますそして、Javaは別のスナップショットで積み重ねられているため、その時点で特定のJava Pileメモリスペースで分析(または除外)できます。
Psyounggen合計466944K、178734K [0xffffffffff70800000、0xfffffffff70800000)Eden Space 233472K、76%使用F45c00000、0xfffffffffffiffffffif. fffffffff62400000、0xffffffff62400000,0xfffffffffff70800000)e 233472k、0%使用[0xffffffffff54000000、 0xffffffffff62400000)psoldgen合計1400832k、1400831k [0xfffffffffffffffffffffff、0xfffffffffffffffffffffffffffffffi) fffffffffffffffffb8,0xfffffffffff45c00000)pspermgen合計262144k、248475k [0 xfffffffffffffee0400000、0xffffffffffffef0400000)オブジェクトスペース262144k、 94%は[0xffffffffffed0400000,0xffffffffffff6a6f08,0xffffffffffee040000を使用しました