Java アプリケーション、特に実稼働環境で実行されているアプリケーションでは、追跡が困難なパフォーマンスのボトルネック、デッドロック、およびメモリ リークが発生する可能性があります。これらの問題が発生した場合、アプリケーションをスムーズに実行し、良好なユーザー エクスペリエンスを維持するには、迅速かつ効果的なデバッグが不可欠です。ここで、VisualVM と JStack が Java 開発者にとって貴重なツールになります。
強力なプロファイリングおよび監視機能を備えたVisualVM と、詳細なスレッド ダンプを提供する jstack は、開発者が複雑な問題を検出、診断、デバッグできるようにする動的な組み合わせです。
デッドロックの診断と解決は、特に高性能アプリケーションでは重要です。このガイドでは、VisualVM と jstack という 2 つの強力な Java ツールを使用してデッドロックを検出し、スレッド ダンプを取得する方法を説明します。
ツールについて詳しく説明する前に、いくつかの基本事項を明確にしましょう。
デッドロック: スレッドが互いにリソースを解放するのを待機しており、無期限のブロック サイクルにつながる状況。
スレッド ダンプ: 特定の時点での Java アプリケーション内のアクティブなスレッドのスナップショット。スレッドの状態と、スレッドが保持または待機しているロックの詳細が含まれます。スレッド ダンプは、Java アプリケーションのデッドロックの原因を分析および特定する上で非常に重要であり、開発者がブロックされたスレッドの原因を正確に特定できるようになります。
VisualVM は、Java アプリケーションの包括的な概要を提供するために、いくつかのコマンドライン JDK ツールを統合したビジュアル ツールです。これは、アプリケーションの監視とプロファイリング、メモリ リークの診断、パフォーマンスの分析に広く使用されています。
実行中の JVM プロセスに接続します。
監視ツールでは、スレッド ダンプをクリックするか、スレッドの詳細をリアルタイムで表示できます。
jstack は、スレッドに大きく依存する複雑なアプリケーションを扱う Java 開発者にとって非常に貴重なコマンドライン ツールです。 jstack は、スレッドの状態、ロック動作、実行フローに関する詳細な洞察を提供することでデバッグ プロセスを簡素化し、デッドロック、パフォーマンスのボトルネック、アプリケーションのフリーズなどの問題の特定と解決を容易にします。
jstack を使用して実行中の Java アプリケーションのスレッド ダンプをキャプチャするには、Java プロセスのプロセス ID (PID) が必要です。ステップバイステップのガイドは次のとおりです:
C:\Program Files\Java\jdk-21\bin>jps -l 12912 22480 org.springframework.ide.vscode.boot.app.BootLanguageServerBootApp 24020 jdk.jcmd/sun.tools.jps.Jps 14344 org/netbeans/Main 21944 deadlock/deadlock.DeadlockExample
C:\Program Files\Java\jdk-21\bin>jstack 21944 2024-11-02 11:12:18 Full thread dump Java HotSpot(TM) 64-Bit Server VM (21.0.5+9-LTS-239 mixed mode, sharing): Threads class SMR info: . .. .... ... "Thread-0" #29 [18484] prio=5 os_prio=0 cpu=0.00ms elapsed=1896.34s tid=0x000001bb3395ac40 nid=18484 waiting for monitor entry [0x00000099227ff000] java.lang.Thread.State: BLOCKED (on object monitor) at deadlock.DeadlockExample.lambda(deadlock/DeadlockExample.java:23) - waiting to lock <0x000000070d03c740> (a java.lang.Object) - locked <0x000000070d05a828> (a java.lang.Object) at deadlock.DeadlockExample$$Lambda/0x000001bb350019f8.run(deadlock/Unknown Source) at java.lang.Thread.runWith(java.base@21.0.5/Thread.java:1596) at java.lang.Thread.run(java.base@21.0.5/Thread.java:1583) "Thread-1" #30 [23240] prio=5 os_prio=0 cpu=0.00ms elapsed=1896.34s tid=0x000001bb3395b2a0 nid=23240 waiting for monitor entry [0x00000099228ff000] java.lang.Thread.State: BLOCKED (on object monitor) at deadlock.DeadlockExample.lambda(deadlock/DeadlockExample.java:41) - waiting to lock <0x000000070d05a828> (a java.lang.Object) - locked <0x000000070d03c740> (a java.lang.Object) at deadlock.DeadlockExample$$Lambda/0x000001bb35001c08.run(deadlock/Unknown Source) at java.lang.Thread.runWith(java.base@21.0.5/Thread.java:1596) at java.lang.Thread.run(java.base@21.0.5/Thread.java:1583) ... ..... .. Found one Java-level deadlock: ============================= "Thread-0": waiting to lock monitor 0x000001bb117727a0 (object 0x000000070d03c740, a java.lang.Object), which is held by "Thread-1" "Thread-1": waiting to lock monitor 0x000001bb11772500 (object 0x000000070d05a828, a java.lang.Object), which is held by "Thread-0" Java stack information for the threads listed above: =================================================== "Thread-0": at deadlock.DeadlockExample.lambda(deadlock/DeadlockExample.java:23) - waiting to lock <0x000000070d03c740> (a java.lang.Object) - locked <0x000000070d05a828> (a java.lang.Object) at deadlock.DeadlockExample$$Lambda/0x000001bb350019f8.run(deadlock/Unknown Source) at java.lang.Thread.runWith(java.base@21.0.5/Thread.java:1596) at java.lang.Thread.run(java.base@21.0.5/Thread.java:1583) "Thread-1": at deadlock.DeadlockExample.lambda(deadlock/DeadlockExample.java:41) - waiting to lock <0x000000070d05a828> (a java.lang.Object) - locked <0x000000070d03c740> (a java.lang.Object) at deadlock.DeadlockExample$$Lambda/0x000001bb35001c08.run(deadlock/Unknown Source) at java.lang.Thread.runWith(java.base@21.0.5/Thread.java:1596) at java.lang.Thread.run(java.base@21.0.5/Thread.java:1583) Found 1 deadlock.
VisualVM と jstack は、特にパフォーマンスの問題、デッドロック、スレッドのボトルネックに対処する場合に、Java アプリケーションの診断とトラブルシューティングを行うための Java 開発者ツールキットの 2 つの必須ツールです。
VisualVM と jstack は、VisualVM が広範なリアルタイムのパフォーマンス洞察を提供し、jstack を使用して、Java アプリケーションをデバッグするための包括的なアプローチを提供します。 スレッドレベルの詳細な分析が可能になります。これらを組み合わせて使用すると、開発者は開発環境と運用環境の両方で複雑な Java の問題を効果的に診断し、解決できます。
この記事の作成を可能にしたオンライン ドキュメント、コミュニティ、利用可能なすべてのリソースに多大な感謝を申し上げます。
以上がVisualVM と jstack を使用した Java アプリのデバッグと監視の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。