|
カテゴリ:IT
Java アプリケーションを(特にマルチスレッドで)動かしてみたら、なんか処理が遅い!とか、なんか処理がハングしている!とか、デッドロックしてるっぽいとかいう場合は、まずスレッドダンプを何回かとってみるというのが常套手段です。スレッドダンプを見れば、各スレッドがどんな順番でメソッドがコールされて、今、何のメソッドのどこを実行しているのかがわかります。スレッドダンプを何回かとって、時系列的に動きを比較するとどこがボトルネックになっているか分かって、ではどうチューニングすれば問題を解消できるのか検討がつくという算段です。
Java 仮想マシンの実装によっては、あからさまなデッドロックが発生している場合は、スレッドダンプに「デッドロックだよ!」と出力してくれたりします。便利ですね。 とはいえ、スレッドダンプはテキストファイルなので、慣れてないと見づらいです。そういう場合は、GUI tail ツール「侍」を使うといいでしょう。 で、スレッドダンプの取得方法ですがこちらとかが参考になりますね。あと、UNIX 系だとターミナルソフトウェアからフォアグランドで Java アプリを実行した場合は、その上で、 Ctrl + \ を押してやることでもゾロゾロとでてきますね。 基本的には、スレッドダンプは標準出力(あるいは標準エラー出力)にでてくるので、java アプリケーション実行時に、出力先を所定のファイルにリダイレクトしておくといいですね。スレッドダンプ取得後にそのファイルをゆっくりながめればいいわけで。 でも、ここで重要な問題があります。 Windows で、java アプリケーションをサービス起動している場合はどうやってスレッドダンプをとるのか? ということです。UNIX 系であれば、java アプリケーションを動かしている java 仮想マシンのプロセス ID を調べて、それに kill コマンドで SIGQUIT を送信すればスレッドダンプがとれるわけです。一方、Windows の場合は、普通は対象となる java アプリケーションを実行したコマンドプロンプト(いわゆる、Dos 窓)がないとスレッドダンプをとれないですよね。サービス起動してしまうとコマンドプロンプトがない状態となってしまうので、スレッドダンプをとるため、どうやって、Ctrl + Break を押せというのでしょうか?さらに、サーバマシンだとキーボードがついてないことがあるので、なおさらです。 サービス起動を使わないという手もありますね。普通に Windows 起動して、コマンドプロンプト開いて、そこで java アプリケーション実行!でも、Windows マシンをサーバとして、サーバサイドで java アプリケーションを稼働させる場合(例えば、Tomcat ベースの Web アプリケーションとか)は、そんな運用方法ありえないですよね。Windows 起動と同時に全自動で java アプリケーションを起動するのが普通なので、結果として Windows サービスを使うことになりますね。加えて、コマンドプロンプトから java アプリケーションを起動した場合、致命的な欠陥が一つあります。それは、 コマンドプロンプト上でカーソルをドラッグして選択状態にしている間、そのコマンドプロンプトから起動した java アプリケーションが一時停止してしまう という現象です。何かのはずみで、選択状態にしたらピタッ!ととまるんです。 #選択状態を解除すればまた動き出しますけど…。Windows の やはり、サーバアプリケーションとして考えるとサービス起動しかありえないわけです。 ということで、Windows で、Java アプリケーションをサービス起動している場合のスレッドダンプ取得方法について、次回「Windows で java スレッドダンプ取得 - 検討編」以降で検討してみます。 #前置き、長っ! お気に入りの記事を「いいね!」で応援しよう
最終更新日
2006年05月27日 03時19分00秒
コメント(0) | コメントを書く
[IT] カテゴリの最新記事
|