- PR -

WebLogic/Windows上のJavaプロセスのスレッドダンプを取得する方法

1
投稿者投稿内容
テクサポ
会議室デビュー日: 2003/11/14
投稿数: 1
投稿日時: 2003-11-14 16:02
Windows2000Serverで、Javaプロセスの障害調査をするために、スレッドダンプをとろうとしています。
しかしながら、困ったことにこのプロセスはWebLogicから起動されており、ウィンドウやコンソールを持たないため、<ctrl><break>でのスレッドダンプがとれません。
何かよい方法はないでしょうか。

プロセスが不意に機能不全になるという現象が起きているのですが、どのスレッドがハングしているのかを調査するため、一定のインターバルをおいてスレッドダンプをとろうと考えています。ですので、スレッドダンプをとる以外に、動作中のプロセスを止めることなく、隠すレッドの状況を知る方法があれば、それでもよいのですが。

よろしくお願いします。
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2003-11-17 15:25
こんにちは、さくらばです。

引用:

テクサポさんの書き込み (2003-11-14 16:02) より:
Windows2000Serverで、Javaプロセスの障害調査をするために、スレッドダンプをとろうとしています。
しかしながら、困ったことにこのプロセスはWebLogicから起動されており、ウィンドウやコンソールを持たないため、<ctrl><break>でのスレッドダンプがとれません。
何かよい方法はないでしょうか。



以下のような方法が考えられると思います。

方法 1. アプリケーションの中に、スレッド監視用のスレッドを作成し、
定期的にスレッドのダンプをログに出力する。
ThreadGroup の list メソッドと同じことをすればいいと思います。

方法 2. JVMPI を使用して、THREAD_START と THREAD_END のイベントを
監視して、ログに記録する。

方法 3. JPDA を利用してスレッドのステータスを外部から取得する
JDI が使えるデバッガならリモートからでもアタッチできるはずです。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-11-17 16:11
unibon です。こんにちわ。

引用:

テクサポさんの書き込み (2003-11-14 16:02) より:
Windows2000Serverで、Javaプロセスの障害調査をするために、スレッドダンプをとろうとしています。
しかしながら、困ったことにこのプロセスはWebLogicから起動されており、ウィンドウやコンソールを持たないため、<ctrl><break>でのスレッドダンプがとれません。


WebLogic はぜんぜん知らないのですが、
Java の VM を起動するからには実行可能ファイル(executable)である
java.exe か javaw.exe を起動していると思います。
#この仮定が違うかもしれませんが、以下、この仮定のもとに書きます。

コンソールが出ない理由として、もし javaw.exe が起動されているならば、
WebLogic のどこかの設定で java.exe が起動するように変更するか、
もしくは java.exe を javaw.exe にリネームしてしまう、という方法があります。
また、java.exe/javaw.exe が Windows のサービスから呼ばれていると、
やはりコンソールが出ないと思うので、
WebLogic をサービスではない通常のプロセスとして起動されてみてはどうでしょうか
(これも具体的なやりかたは知らないですが)。

もっとも WebLogic の管理ツールなどに、
Ctrl + Break 相当の機能が備わっていてもよさそうな感じもするので、
探してみるのも手かもしれませんが。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2003-11-17 16:11
>WebLogic はぜんぜん知らないのですが、
>Java の VM を起動するからには実行可能ファイル(executable)である
>java.exe か javaw.exe を起動していると思います。
>#この仮定が違うかもしれませんが、以下、この仮定のもとに書きます。
今回は、WebLogic ではなく、「WebLogicから起動したプロセス」についての話題ですので、ちょっと違うかもしれません。

でも、根本的な解決方法として、WLS から JVM のプロセスを別途上げないようにはできないでしょうか?

WLS内蔵の CGIServlet や、Runtime.exec() などでプロセスを起動することはもちろんできますが、JVM のプロセスは OS のリソースを大変消費するためサーバサイドでぼこぼこ上げることはあまりお勧めできません。

非同期で駆動したいのなら、MDB を使うとか、またはスタートアップクラス内でスレッドを起動するとか。そうすれば運用上も安心できますし、WLS のスレッドダンプから解析することができます。
また、WLS のスレッドダンプであれば weblogic.Admin ツールより出力させることができます。
http://edocs.beasys.co.jp/e-docs/wls/docs81/admin_ref/cli.html#1197887

Windowsサービスとして起動している場合は beasvc でサービスに登録する際、-log:filename オプションで標準出力をファイルに落とせます。起動中は上記の weblogic.Admin コマンドか beasvc -dump -svcname:[サービス名] でスレッドダンプが取得可能です。
http://edocs.beasys.co.jp/e-docs/wls/docs81/adminguide/winservice.html

[ メッセージ編集済み 編集者: インギ 編集日時 2003-11-17 16:30 ]
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-11-18 18:27
unibon です。こんにちわ。

引用:

インギさんの書き込み (2003-11-17 16:11) より:
>WebLogic はぜんぜん知らないのですが、
>Java の VM を起動するからには実行可能ファイル(executable)である
>java.exe か javaw.exe を起動していると思います。
>#この仮定が違うかもしれませんが、以下、この仮定のもとに書きます。
今回は、WebLogic ではなく、「WebLogicから起動したプロセス」についての話題ですので、ちょっと違うかもしれません。


勘違いしてました。
WebLogic からさらに java.lang.Runtime.exec で java.exe/javaw.exe を
起動するような感じなのでしょうかね。

以下、プロセス起動時にコンソールを出すことに限定して書きますが、
Windows 上で Runtime.exec を呼ぶと、java.lang.Win32Process クラスが使われますが、
そこから JNI で Win32 の CreatProcess の API が呼ばれているようです。
そして、その API の引数がウィンドウを出さない指定になっているようです。
ここを少し変えるだけで良さそうなのですが、指定を変えることはできないらしく、
これと同じ機能を新たに作るのは大変なので探したのですが、
あんまり見つかりませんでした。

一応、惜しいものとしては、Eclipse (というか SWT?)の環境だと、
コード:
import org.eclipse.swt.program.*;

public class Hoge {

    public static void main(String[] args) {
        Program.launch("c:\\j2sdk1.4.2\\bin\\java.exe");
    }
}


のようことはできるのですが、
残念ながら引数(クラスパスやクラス名)を指定できないようなので、
java の説明の画面が一瞬表示できるのですが、それまでです。
他のクラスでできるのかもしれませんが、どなたかご存知ないでしょうか。
#JNI のプログラムを作ってしまうほうが早い?
1

スキルアップ/キャリアアップ(JOB@IT)