-
概観
- jstack関連コンテンツ
-
背景
- 以前にjvmの関連するコマンドラインツールを見ました
- jinfo
- jstat
- jmap
- ジャット
- 彼らの方向性
- jvm起動パラメーター
- メモリリソース
- GC統計
- スタックのスナップショット
- スタック分析
- スタック?ヒープだけではないですか?
- はい、スタックはどうですか?
- 以前にjvmの関連するコマンドラインツールを見ました
-
環境
-
準備ができて
-
Javaプログラム
- スプリングブートに基づくwebmvcプログラムを使用しています
- コントローラーのハローワールド
- スプリングブートに基づくwebmvcプログラムを使用しています
-
jps
- Javaプログラムpidを取得する
-
jvmについて少し知識があることが最善です。
- 私のレベルは同じではありません、基本的には敷居を這うようなものです
-
1. jstack
-
概観
- jstackの概要
-
jstack
- jvmスタックスナップショットツール
-
積み重ね
- JVMスレッドがアクティブな場所
-
スタックの内容
- スレッドで分割
- 各スレッドには独自のものがあります
- スレッド固有の情報を格納するためのさまざまなレジスター
- メソッドスタック
- 作業中の各スレッドには、独自の一連のメソッド呼び出しがあります。
- これらの呼び出しは、スタックの形でメモリに格納されます
- 分類-詳細はありません
- Javaスタック
- Javaメソッド情報を保存する
- ネイティブメソッドスタック
- ローカルメソッド情報を保存する
- たとえば、javaによって呼び出されるC言語
- ローカルメソッド情報を保存する
- 両者の関係
- 正直わからない…
- Javaスタック
-
- jvmスタックスナップショットツール
2.コマンド
-
コマンド
> jstack <pid>
-
その結果
- この結果は少し複雑です、ゆっくりと言います
3.結果
-
概観
- jstackの結果を簡単に説明する
-
その結果
-
コマンドが実行されると、jvmスタック内の情報
- 主にメソッド呼び出し情報
-
内容
- たくさんのコンテンツ、ハローワールドに500行あります...
-
セグメント1-jvm情報
-
スニペット
2020-04-11 19:20:35
フルスレッドダンプJava HotSpot(TM)64ビットサーバーVM(25.181-b13混合モード):
`` `
- 内容
-
2020-04-11 19:20:35
- jstackコマンドの実行時間
-
フルスレッドダンプJava HotSpot(TM)64ビットサーバーVM(25.181-b13混合モード):
- 64ビット
- 64ビットシステム
- サーバーVM
- JVMサーバーモード
- 25.181-b13
- JVMビルド番号
- ミックスモード
- HotSpot仮想マシンのデフォルトモード
- 後で追加する必要があります
- HotSpot仮想マシンのデフォルトモード
- 64ビット
-
セグメント2-JNIグローバル参照
-
スニペット
# 这个位于 输出日志的 最下方 JNI global references: 1041
-
説明する
- JNIグローバル参照:1041
- JNI-Javaネイティブインターフェース
- Javaのネイティブインターフェイス
- 他の言語の呼び出しと対話を担当
- グローバル参照
- JNIリファレンス
- ローカル参照
- このスレッドのネイティブメソッドの変数
- Javaに戻った後に自動的に解放する
- グローバルリファレンス
- 複数のメソッドで使用される複数のスレッド
- 手動で作成、リリースする必要がある
- 弱いグローバル参照
- グローバルリファレンスと一致
- しかし、それはGCかもしれません
- ローカル参照
- JNIリファレンス
- 1041
- 現在1041のグローバルリファレンスがあります
- JNI-Javaネイティブインターフェース
- JNIグローバル参照:1041
セグメント3:VM定期タスクスレッドのスレッドセグメント
-
スニペット
"VM Periodic Task Thread" os_prio=2 tid=0x000000003c4c5800 nid=0x5110 waiting on condition
-
説明する
- 「VM定期タスクスレッド」
- スレッド名
- これはHotSpotの監視プロセスです
- 定期的なタスクを実行して、jvmのさまざまな情報を取得する
- スレッド名
- os_prio = 2
- システムプロセスの優先度
- これはオペレーティングシステムと関係があります
- 後でJavaスレッドの優先順位について話します...
- システムプロセスの優先度
- 時間= 0x000000003c4c5800
- JavaスレッドID
- JVMのスレッドID
- JavaスレッドID
- ない= 0x5110
- ネイティブシステムスレッドID
- 各Javaスレッドには、ネイティブシステムに対応するスレッドIDがあります
- ネイティブシステムスレッドID
- 待機中
- スレッドが待機していることを示します
- 特定の条件なし
- スレッドが待機していることを示します
- 「VM定期タスクスレッド」
セグメント4:GCスレッドセグメント
-
スニペット
# 这样类似的片段, 一共有 9 个 "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00000000031bb000 nid=0x1c54 runnable "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00000000031bd000 nid=0x3718 runnable ...
-
説明する
- 「GCタスクスレッド#0(ParallelGC)」
- スレッド名
- GCスレッド
- 番号0
- ParallelGCの使用
- スレッド名
- os_prio = 0
- システムプロセスの優先度
- 時間= 0x00000000031bb000
- JavaスレッドID
- ない= 0x1c54
- ネイティブシステムスレッドID
- 実行可能
- スレッドの状態
- これは当面ここにはありません
- スレッドの状態
- 「GCタスクスレッド#0(ParallelGC)」
セグメント5:通常のスレッドセグメント
-
スニペット
"http-nio-8080-ClientPoller-1"#45デーモンprio = 5 os_prio = 0 tid = 0x000000003e78e800 nid = 0x574 runnable [0x0000000040d8f000]
java.lang.Thread.State:RUNNABLE
at sun.nio.ch.WindowsSelectorImpl \(SubSelector .poll0(ネイティブメソッド)at sun.nio.ch.WindowsSelectorImpl \) SubSelector.poll(WindowsSelectorImpl.java:296)
at sun.nio.ch.WindowsSelectorImpl $ SubSelector.access $ 400(WindowsSelectorImpl.java:278)
at sun.nio .ch.WindowsSelectorImpl.doSelect(WindowsSelectorImpl.java:159)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
-ロック<0x00000006768fe120>(sun.nio.ch.Util \(3)-ロック<0x00000006768fe110>(java.util.Collections \) UnmodifiableSet)
-org.apache.tomcat.util.net.NioEndpoint
$ Poller.run(NioEndpoint )のsun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)でロックされた<0x00000006768fdfc0>(sun.nio.ch.WindowsSelectorImpl).java:743)
at java.lang.Thread.run(Thread.java:748)
```
- 説明する
- 「http-nio-8080-ClientPoller-1」
- スレッド名
-
45
- 私はこれを長い間探していましたが、何と呼ばれているのかわかりません。
- 一部のスレッドが実行する理由と、一部のスレッドが実行しない理由がわかりません。
- サイズの規則性すらわかりません
- 私はこれを長い間探していましたが、何と呼ばれているのかわかりません。
- デーモン
- デーモンスレッド
- 現在のスレッドはデーモンスレッドです
- デーモンスレッド
- プリオン= 5
- os_prio = 0
- 時間= 0x000000003e78e800
- ない= 0x574
- 実行可能
- 実行可能な状態
- [0x0000000040d8f000]
- スレッドのスタック開始アドレス
- 開始アドレスは[0x0000000000000000]です
- これらは通常jvmプロセスです
- 彼らはオペレーティングシステムを扱う必要があるので、スタックの出発点はローカルメソッドスタックです
- もちろん、すべてのjvmプロセスが[0x0000000000000000]で始まるわけではありません
- java.lang.Thread.State:RUNNABLE
- スレッドのステータス...
- 以下のスタック情報
- このスレッドによって実行されているメソッド呼び出しチェーン
- 上に新しい、下に古い
- 「http-nio-8080-ClientPoller-1」
PS
-
ref
-
- 公式文書
- 内容は少し薄いです
-
JVMの実用的なパラメータ(1)JVMタイプとコンパイラモード
- 翻訳はOKです
- 2012年からの古い記事...
- ミックスモード
-
JNI学習3(ローカル参照&グローバル参照とJNIメモリリーク)
- JNIの説明
- これは気にしない
- JNIの説明
-
- はっきりと話す
- jstackダンプ情報
- Javaスレッドの状態
- ロック関連
- はっきりと話す
-
JVM障害分析とパフォーマンス最適化シリーズ第2部:jstackによって生成されるスレッドダンプログ構造分析
- よく書かれた
- コンテンツを科学的に分割する
- そして、スレッドのコンポーネントに従って、それは明確に分類されます
- そしてそれはまだシリーズです...
- よく見て
- よく書かれた
-
3つの例は、Javaスレッドダンプのログ分析を示しています。
- リファレンスに値する
-
- リファレンスに値する
-
-
ご質問
- ミックスモード
- スレッドの状態
- スレッドの状態
- 状態遷移
- jstackによるデッドロック問題の分析と診断
- ロックの原理
- スレッドの状態を理解する
- デッドロックスレッドを見つける
-
フォローアップ
- 可視化ツール