ホームページ  >  記事  >  Java  >  VisualVM と jstack を使用した Java アプリのデバッグと監視

VisualVM と jstack を使用した Java アプリのデバッグと監視

DDD
DDDオリジナル
2024-11-07 08:37:02114ブラウズ

Java アプリケーション、特に実稼働環境で実行されているアプリケーションでは、追跡が困難なパフォーマンスのボトルネックデッドロック、およびメモリ リークが発生する可能性があります。これらの問題が発生した場合、アプリケーションをスムーズに実行し、良好なユーザー エクスペリエンスを維持するには、迅速かつ効果的なデバッグが不可欠です。ここで、VisualVM と JStack が Java 開発者にとって貴重なツールになります。

強力なプロファイリングおよび監視機能を備えた

VisualVM と、詳細なスレッド ダンプを提供する jstack は、開発者が複雑な問題を検出、診断、デバッグできるようにする動的な組み合わせです。

デッドロックの診断と解決は、特に高性能アプリケーションでは重要です。このガイドでは、VisualVMjstack という 2 つの強力な Java ツールを使用してデッドロックを検出し、スレッド ダンプを取得する方法を説明します。

1. デッドロックとスレッドダンプについて

ツールについて詳しく説明する前に、いくつかの基本事項を明確にしましょう。

デッドロック: スレッドが互いにリソースを解放するのを待機しており、無期限のブロック サイクルにつながる状況。

スレッド ダンプ: 特定の時点での Java アプリケーション内のアクティブなスレッドのスナップショット。スレッドの状態と、スレッドが保持または待機しているロックの詳細が含まれます。スレッド ダンプは、Java アプリケーションのデッドロックの原因を分析および特定する上で非常に重要であり、開発者がブロックされたスレッドの原因を正確に特定できるようになります。

2. VisualVM の概要

VisualVM は、Java アプリケーションの包括的な概要を提供するために、いくつかのコマンドライン JDK ツールを統合したビジュアル ツールです。これは、アプリケーションの監視とプロファイリング、メモリ リークの診断、パフォーマンスの分析に広く使用されています。

主な特長

  • ライブモニタリングとプロファイリング
  • スレッド分析
  • メモリと CPU の使用状況に関する洞察
  • デッドロック分析用のスレッド ダンプ

VisualVM を使用したデバッグ (Java アプリケーションの場合)

  • VisualVM をダウンロード
  • VisualVM を開きます。
  • 実行中の JVM プロセスに接続します。
    Debug and Monitor Java App with VisualVM and jstack

  • 監視ツールでは、スレッド ダンプをクリックするか、スレッドの詳細をリアルタイムで表示できます。

Debug and Monitor Java App with VisualVM and jstack

Debug and Monitor Java App with VisualVM and jstack

3. jstack の概要

jstack は、スレッドに大きく依存する複雑なアプリケーションを扱う Java 開発者にとって非常に貴重なコマンドライン ツールです。 jstack は、スレッドの状態、ロック動作、実行フローに関する詳細な洞察を提供することでデバッグ プロセスを簡素化し、デッドロック、パフォーマンスのボトルネック、アプリケーションのフリーズなどの問題の特定と解決を容易にします。

主な特長

  • jstack は、RUNNABLEBLOCKEDWAITING、または TIMED_WAITING などの各スレッドの状態を表示します。
  • ライブまたはハングしたプロセスのスタック トレースをキャプチャして、複雑なスレッド問題のデバッグに役立てます。
  • jstack は、スレッド ダンプ内でデッドロックされたスレッドをマークし、それらを迅速に特定できるようにします。
  • JVM 内のすべてのアクティブなスレッドをリストするスレッド ダンプを取得します。
  • jstack を VisualVMjmap などの他のツールと組み合わせると、過剰なオブジェクトの作成や参照の保持の原因となるスレッドまでメモリ リークを追跡するのに役立ちます。
  • 開発者はスレッド ダンプを分析することで、問題のある同期、過剰なブロック、または競合を減らす機会を特定し、同時実行性と応答性の向上につながります。

jstack を使用したスレッド ダンプの取得と分析

jstack を使用して実行中の Java アプリケーションのスレッド ダンプをキャプチャするには、Java プロセスのプロセス ID (PID) が必要です。ステップバイステップのガイドは次のとおりです:

  • ステップ 1: 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
  • ステップ 2: jstack を使用してスレッド ダンプをキャプチャする
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.

注記

  • jstack は JDK で使用できるため、JDK が環境にインストールされ、アクセスできることを確認してください。
  • 一部のシステムで jstack を使用するには、管理者権限が必要な場合があります。
  • jstack -l 12345 の使用> threaddump.txt は、スレッド ダンプを threaddump.txt というファイルに保存します。

アウトロ

VisualVMjstack は、特にパフォーマンスの問題、デッドロック、スレッドのボトルネックに対処する場合に、Java アプリケーションの診断とトラブルシューティングを行うための Java 開発者ツールキットの 2 つの必須ツールです。

VisualVMjstack は、VisualVM が広範なリアルタイムのパフォーマンス洞察を提供し、jstack を使用して、Java アプリケーションをデバッグするための包括的なアプローチを提供します。 スレッドレベルの詳細な分析が可能になります。これらを組み合わせて使用​​すると、開発者は開発環境と運用環境の両方で複雑な Java の問題を効果的に診断し、解決できます。

参照

この記事の作成を可能にしたオンライン ドキュメント、コミュニティ、利用可能なすべてのリソースに多大な感謝を申し上げます。

  1. VisualVM の使用方法
  2. マルチスレッドの概念 パート 1: 原子性と不変性
  3. Java VisualVM

以上がVisualVM と jstack を使用した Java アプリのデバッグと監視の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。