この記事の内容は、JDK ツール jstack を使用してランタイム プログラムのデッドロックの原因を調べることに関するものです。必要な方は参考にしていただければ幸いです。
Java マルチスレッド プログラミングは、Java のインタビューでもよく取り上げられます。 Java マルチスレッド プログラミングに慣れていない友人は、デッドロックを引き起こす可能性のあるアプリケーションを誤って作成してしまう可能性があります。 Java マルチスレッドの原因を分析するにはどうすればよいですか?デッドロックを引き起こす疑いのあるステートメントにブレークポイントを設定し、シングルステップ デバッグを行うことがよくありますが、再現することはできません。シングルステップ デバッグとプログラムの直接実行ではコード実行のタイミングが異なり、デッドロックのトリガー条件が満たされない可能性があるため、この現象は正常です。
実際、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 であることがわかります。
次に、コマンド ライン jstack 51476 を使用して、このプロセスの実行中のスタック情報を出力します。プロセス。
上の図で赤で強調表示されている 0x00000000d6f64988 と 0x00000000d6f649b8 は、コード内の 2 つのリソース「ABAP」と「Java」を表しています。
jstack によって出力される出力は非常に明確で、Java コードのどの行がどの Java リソース (下の図ではロックを待機中) をロックしようとしたが失敗したことを示しています。失敗の理由は、そのリソースが現在要求されているリソースのスレッド名も出力されます。
jstack を使用すると、Java プログラマーは、長くて頭を使うマルチスレッド コードについて真剣に考える必要がなくなり、JDK が原因を自動的に出力します。行き詰まりが出てくるのはとても便利です。
以上がJDK のツール jstack を使用してランタイム プログラムのデッドロックの原因を特定するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。