Java-JVM-JStackの概要

  1. 概観

    1. jstack関連コンテンツ
  2. 背景

    1. 以前にjvmの関連するコマンドラインツールを見ました
      1. jinfo
      2. jstat
      3. jmap
      4. ジャット
    2. 彼らの方向性
      1. jvm起動パラメーター
      2. メモリリソース
        1. GC統計
        2. スタックのスナップショット
        3. スタック分析
    3. スタック?ヒープだけではないですか?
      1. はい、スタックはどうですか?
  3. 環境

  4. 準備ができて

    1. Javaプログラム

      1. スプリングブートに基づくwebmvcプログラムを使用しています
        1. コントローラーのハローワールド
    2. jps

      1. Javaプログラムpidを取得する
    3. jvmについて少し知識があることが最善です。

      1. 私のレベルは同じではありません、基本的には敷居を這うようなものです

1. jstack

  1. 概観

    1. jstackの概要
  2. jstack

    1. jvmスタックスナップショットツール
      1. 積み重ね

        1. JVMスレッドがアクティブな場所
      2. スタックの内容

        1. スレッドで分割
        2. 各スレッドには独自のものがあります
          1. スレッド固有の情報を格納するためのさまざまなレジスター
          2. メソッドスタック
            1. 作業中の各スレッドには、独自の一連のメソッド呼び出しがあります。
            2. これらの呼び出しは、スタックの形でメモリに格納されます
        3. 分類-詳細はありません
          1. Javaスタック
            1. Javaメソッド情報を保存する
          2. ネイティブメソッドスタック
            1. ローカルメソッド情報を保存する
              1. たとえば、javaによって呼び出されるC言語
          3. 両者の関係
            1. 正直わからない…

2.コマンド

  1. コマンド

    > jstack <pid>
    
  2. その結果

    1. この結果は少し複雑です、ゆっくりと言います

3.結果

  1. 概観

    1. jstackの結果を簡単に説明する
  2. その結果

    1. コマンドが実行されると、jvmスタック内の情報

      1. 主にメソッド呼び出し情報
    2. 内容

      1. たくさんのコンテンツ、ハローワールドに500行あります...

セグメント1-jvm情報

  1. スニペット

    2020-04-11 19:20:35
    

フルスレッドダンプJava HotSpot(TM)64ビットサーバーVM(25.181-b13混合モード):
`` `

  1. 内容
    1. 2020-04-11 19:20:35

      1. jstackコマンドの実行時間
    2. フルスレッドダンプJava HotSpot(TM)64ビットサーバーVM(25.181-b13混合モード):

      1. 64ビット
        1. 64ビットシステム
      2. サーバーVM
        1. JVMサーバーモード
      3. 25.181-b13
        1. JVMビルド番号
      4. ミックスモード
        1. HotSpot仮想マシンのデフォルトモード
          1. 後で追加する必要があります

セグメント2-JNIグローバル参照

  1. スニペット

    # 这个位于 输出日志的 最下方
    JNI global references: 1041
    
  2. 説明する

    1. JNIグローバル参照:1041
      1. JNI-Javaネイティブインターフェース
        1. Javaのネイティブインターフェイス
        2. 他の言語の呼び出しと対話を担当
      2. グローバル参照
        1. JNIリファレンス
          1. ローカル参照
            1. このスレッドのネイティブメソッドの変数
            2. Javaに戻った後に自動的に解放する
          2. グローバルリファレンス
            1. 複数のメソッドで使用される複数のスレッド
            2. 手動で作成、リリースする必要がある
          3. 弱いグローバル参照
            1. グローバルリファレンスと一致
            2. しかし、それはGCかもしれません
      3. 1041
        1. 現在1041のグローバルリファレンスがあります

セグメント3:VM定期タスクスレッドのスレッドセグメント

  1. スニペット

    "VM Periodic Task Thread" os_prio=2 tid=0x000000003c4c5800 nid=0x5110 waiting on condition 
    
  2. 説明する

    1. 「VM定期タスクスレッド」
      1. スレッド名
        1. これはHotSpotの監視プロセスです
        2. 定期的なタスクを実行して、jvmのさまざまな情報を取得する
    2. os_prio = 2
      1. システムプロセスの優先度
        1. これはオペレーティングシステムと関係があります
        2. 後でJavaスレッドの優先順位について話します...
    3. 時間= 0x000000003c4c5800
      1. JavaスレッドID
        1. JVMのスレッドID
    4. ない= 0x5110
      1. ネイティブシステムスレッドID
        1. 各Javaスレッドには、ネイティブシステムに対応するスレッドIDがあります
    5. 待機中
      1. スレッドが待機していることを示します
        1. 特定の条件なし

セグメント4:GCスレッドセグメント

  1. スニペット

    # 这样类似的片段, 一共有 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 
    
    ...
    
  2. 説明する

    1. 「GCタスクスレッド#0(ParallelGC)」
      1. スレッド名
        1. GCスレッド
        2. 番号0
        3. ParallelGCの使用
    2. os_prio = 0
      1. システムプロセスの優先度
    3. 時間= 0x00000000031bb000
      1. JavaスレッドID
    4. ない= 0x1c54
      1. ネイティブシステムスレッドID
    5. 実行可能
      1. スレッドの状態
        1. これは当面ここにはありません

セグメント5:通常のスレッドセグメント

  1. スニペット

"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)

```
  1. 説明する
    1. 「http-nio-8080-ClientPoller-1」
      1. スレッド名
    2. 45

      1. 私はこれを長い間探していましたが、何と呼ばれているのかわかりません。
        1. 一部のスレッドが実行する理由と、一部のスレッドが実行しない理由がわかりません。
        2. サイズの規則性すらわかりません
    3. デーモン
      1. デーモンスレッド
        1. 現在のスレッドはデーモンスレッドです
    4. プリオン= 5
    5. os_prio = 0
    6. 時間= 0x000000003e78e800
    7. ない= 0x574
    8. 実行可能
      1. 実行可能な状態
    9. [0x0000000040d8f000]
      1. スレッドのスタック開始アドレス
      2. 開始アドレスは[0x0000000000000000]です
        1. これらは通常jvmプロセスです
        2. 彼らはオペレーティングシステムを扱う必要があるので、スタックの出発点はローカルメソッドスタックです
        3. もちろん、すべてのjvmプロセスが[0x0000000000000000]で始まるわけではありません
    10. java.lang.Thread.State:RUNNABLE
      1. スレッドのステータス...
    11. 以下のスタック情報
      1. このスレッドによって実行されているメソッド呼び出しチェーン
      2. 上に新しい、下に古い

PS

  1. ref

    1. jstack

      1. 公式文書
      2. 内容は少し薄いです
    2. JVMの実用的なパラメータ(1)JVMタイプとコンパイラモード

      1. 翻訳はOKです
      2. 2012年からの古い記事...
      3. ミックスモード
    3. JNI学習3(ローカル参照&グローバル参照とJNIメモリリーク)

      1. JNIの説明
        1. これは気にしない
    4. 4.5 jstack

      1. はっきりと話す
        1. jstackダンプ情報
        2. Javaスレッドの状態
        3. ロック関連
    5. JVM障害分析とパフォーマンス最適化シリーズ第2部:jstackによって生成されるスレッドダンプログ構造分析

      1. よく書かれた
        1. コンテンツを科学的に分割する
        2. そして、スレッドのコンポーネントに従って、それは明確に分類されます
        3. そしてそれはまだシリーズです...
        4. よく見て
    6. 3つの例は、Javaスレッドダンプのログ分析を示しています。

      1. リファレンスに値する
    7. 仮想マシンスタックの完全な分析

      1. リファレンスに値する
    8. Javaコマンド学習シリーズ(2)-Jstack

  2. ご質問

    1. ミックスモード
    2. スレッドの状態
      1. スレッドの状態
      2. 状態遷移
    3. jstackによるデッドロック問題の分析と診断
      1. ロックの原理
      2. スレッドの状態を理解する
      3. デッドロックスレッドを見つける
  3. フォローアップ

    1. 可視化ツール

おすすめ

転載: www.cnblogs.com/xy14/p/12683383.html