JDK のツール jstack を使用してランタイム プログラムのデッドロックの原因を特定する

不言
リリース: 2018-10-24 11:06:28
転載
2097 人が閲覧しました

この記事の内容は、JDK ツール jstack を使用してランタイム プログラムのデッドロックの原因を調べることに関するものです。必要な方は参考にしていただければ幸いです。

Java マルチスレッド プログラミングは、Java のインタビューでもよく取り上げられます。 Java マルチスレッド プログラミングに慣れていない友人は、デッドロックを引き起こす可能性のあるアプリケーションを誤って作成してしまう可能性があります。 Java マルチスレッドの原因を分析するにはどうすればよいですか?デッドロックを引き起こす疑いのあるステートメントにブレークポイントを設定し、シングルステップ デバッグを行うことがよくありますが、再現することはできません。シングルステップ デバッグとプログラムの直接実行ではコード実行のタイミングが異なり、デッドロックのトリガー条件が満たされない可能性があるため、この現象は正常です。

JDK のツール jstack を使用してランタイム プログラムのデッドロックの原因を特定する

実際、JDK は、実行中のプログラムとデッドロックされたアプリケーションの状態を直接分析できる強力なデッドロック分析ツールを Java プログラマに提供しました。デッドロックの原因となった Java コードの特定の行。

この記事では、例を使用して、JDK が提供する標準ツールの使用方法を示します。

このツールは jstack と呼ばれ、JDK インストール ディレクトリの bin フォルダーにある実行可能ファイルです。

まず、デッドロックを引き起こすアプリケーションを作成します。

public class DeadLockExample {
    public static void main(String[] args) {
        final String resource1 = "ABAP";
        final String resource2 = "Java";
        Thread t1 = new Thread() {
            public void run() {
                synchronized (resource1) {
                    System.out.println("Thread 1: locked resource 1");
                    try {
                        Thread.sleep(100);
                    }
                    catch (Exception e) {
                    }
                    synchronized (resource2) {
                        System.out.println("Thread 1: locked resource 2");
                    }
                }
            }
        }
        ;
        Thread t2 = new Thread() {
            public void run() {
                synchronized (resource2) {
                    System.out.println("Thread 2: locked resource 2");
                    try {
                        Thread.sleep(100);
                    }
                    catch (Exception e) {
                    }
                    synchronized (resource1) {
                        System.out.println("Thread 2: locked resource 1");
                    }
                }
            }
        }
        ;
        t1.start();
        t2.start();
    }
}
ログイン後にコピー

アプリケーションのアイデアは非常に単純です。2 つのスレッドを同時に開始し、resource1 と resource2 をそれぞれロックし、0.1 秒間スリープしてから、リソース resource2 と resource1 をそれぞれ要求してみます。

アプリケーションを実行し、次の出力をコンソールに出力した後、デッドロック状態に入ります。

スレッド 1: ロックされたリソース 1

スレッド 2: ロックされたリソース 2

コマンド ライン jps -l -m を使用して、デッドロック状態にあるアプリケーションのプロセス ID を見つけます。以下の図から、デッドロック プロセスは 51476 であることがわかります。

JDK のツール jstack を使用してランタイム プログラムのデッドロックの原因を特定する

次に、コマンド ライン jstack 51476 を使用して、このプロセスの実行中のスタック情報を出力します。プロセス。

JDK のツール jstack を使用してランタイム プログラムのデッドロックの原因を特定する

上の図で赤で強調表示されている 0x00000000d6f64988 と 0x00000000d6f649b8 は、コード内の 2 つのリソース「ABAP」と「Java」を表しています。

jstack によって出力される出力は非常に明確で、Java コードのどの行がどの Java リソース (下の図ではロックを待機中) をロックしようとしたが失敗したことを示しています。失敗の理由は、そのリソースが現在要求されているリソースのスレッド名も出力されます。

JDK のツール jstack を使用してランタイム プログラムのデッドロックの原因を特定する

jstack を使用すると、Java プログラマーは、長くて頭を使うマルチスレッド コードについて真剣に考える必要がなくなり、JDK が原因を自動的に出力します。行き詰まりが出てくるのはとても便利です。

以上がJDK のツール jstack を使用してランタイム プログラムのデッドロックの原因を特定するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!