2012-07-10 7 views
8

私は次のような問題があります。
WebアプリケーションをTomcat(Linux)にデプロイし、Tomcatのシャットダウン後にps -efのプロセスを実行すると、まだjavaプロセスが実行されています。
私はこれが何らかのぶら下がりスレッドのために起こると思いますが、私はこのスレッドをどのように追跡することができないのか分かりません。
この問題をどのようにデバッグできますか?ハングするJavaスレッドをどのようにデバッグできますか?

答えて

5

以下に説明するように、4-5スレッドダンプを生成し、Samuraiのようなツールを使用してそれらを解析することができます。

スタックスレッドまたは長期実行トランザクションが発生した場合、すべてのスレッドダンプに、特定のスレッドIDがJavaスタックトレース内の同じ行にあることが表示されます。簡単に言えば、トランザクションは複数のスレッド・ダンプにまたがっているため、より多くの調査が必要です。

Samuraiでこれらを実行すると、赤色で強調表示されるので、すばやくクリックして問題を示す行に移動できます。

この例のhereを参照してください。そのリンクのSamurai出力イメージを見てください。緑色のセルは問題ありません。赤とグレーの細胞は見る必要があります。 JVMは、単にCtrl-\を押して、コンソールで実行されている場合

(Linux)の

スレッドダンプを生成します。 JVMは、それにQUITシグナルを送るバックグラウンドで実行されている場合:

kill -QUIT process_id

ありprocess_idを、実行中のJavaプロセスのプロセス番号です。スレッドダンプは、標準出力がリダイレクトされたところに送られます。 あなたは、一般的にコマンドで実行中のすべてのJavaプロセスのプロセス番号を取得することができます。

ps axf | grep java

+0

そのないジムが求めていることを、彼はapprochをデバッグするために求めています。 –

+0

@ user1348753編集を参照してください。 – aviad

+0

@aviad:私は 'kill -3'を行い、Samurai.Theにjavacoreをロードしました。ログレポーターだけの視覚的なテーブルはありませんでした。 t。このレポートからスレッドをどのようにトレースできますか? – Jim

2

あなたは正しい、あなたのJavaプロセスがまだ存在していると言いますか? プロセスにはスレッドが接続されている限り存在します。 もしそうなら、私は次のようなアプローチのために行くだろう: - そこに(そして、あなたはQUITシグナルを送った後、プロセスに接続し、スレッドダンプを取得するJVM

が内部で接続され、管理MBeanサーバーにプロセスを実行そのためにJMXをする必要があります。あなたに不審見ているスレッドを参照してください。

を、私はあなたにもスレッドダンプ取るためにJVisualVMを使用することができると思う...

+0

私はあなたがお勧めする方法を知る方法がわかりません – Jim

+0

これはさらに簡単ですが、既に提案されているaviad :):http://www.crazysquirrel.com/computing/java/basics/java-thread-dump.jspx –

+0

JVisualVMのアプローチについては、こちらのチュートリアルhttp://docs.oracle.com /javase/6/docs/technotes/guides/visualvm/threads.html。基本的にjvisualvmは、$ JAVA_HOME/binフォルダにある実行可能ファイルです。実行し、アプリケーションに接続し、それを使って何ができるかを見てください。非常に強力なもの、本当に:) –

関連する問題