次の問題があります
。Web アプリケーションを Tomcat (Linux) にデプロイし、Tomcat をシャットダウンした後でも、実行中のプロセスをps -ef
確認できます。
これはスレッドがハングしているために発生していると思いますが、このスレッドを追跡する方法がわかりません。
この問題をデバッグするにはどうすればよいですか? java
2 に答える
以下で説明するように 4 ~ 5 個のスレッド ダンプを生成し、Samuraiなどのツールを使用してそれらを分析できます。
チェックする必要があるのは、スタック スレッドまたは実行時間の長いトランザクションが発生したときです。すべてのスレッド ダンプは、特定のスレッド ID が Java スタック トレースの同じ行にあることを示します。簡単に言えば、トランザクションが複数のスレッド ダンプにまたがっているため、さらに調査が必要です。
これらをSamuraiで実行すると、これらが赤色で強調表示されるため、すばやくクリックして、問題を示す行に移動できます。
この例をここで参照してください。そのリンクの Samurai の出力画像を見てください。緑のセルは問題ありません。赤と灰色のセルを確認する必要があります。
スレッド ダンプの生成:
(Linux)
JVM がコンソールで実行されている場合は、単純に を押しCtrl-\
ます。JVM がバックグラウンドで実行されている場合は、QUIT シグナルを送信します。
kill -QUIT process_id
process_id は、実行中の Java プロセスのプロセス番号です。スレッド ダンプは、標準出力がリダイレクトされる場所にも送信されます。通常、次のコマンドを使用して、実行中のすべての Java プロセスのプロセス番号を取得できます。
ps axf | grep java
あなたはあなたのJavaプロセスがまだ存在していると言いますよね?プロセスは、スレッドが接続されている限り存在しますよね?もしそうなら、私は次のアプローチに行きます:-JVMによって内部的に接続され管理されているMBeanサーバーでプロセスを実行します
次に、QUITシグナルを送信した後、プロセスに接続し、スレッドダンプを取得します(そのためのJMXが必要です。どのスレッドが疑わしいと思われるかを確認してください。
JVisualVMを使用してスレッドダンプを取得することもできると思います...