谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

VisualVMでSAStrutsのプロファイリングなど試してみる その1

VisualVMを使って、
ローカルPC上のTomcatで動くWebアプリケーションの
プロファイリングを行なってみましょう。


前準備

  1. http://tomcat.apache.org/ よりTomcat6をダウンロードして解凍する。
  2. http://sastruts.seasar.org/ より SAStrutsチュートリアルをダウンロードして解凍する。
  3. SAStrutsのwebappのフォルダ名をsastrutsに変更して、Tomcatのwebapps直下にコピー。
  4. Tomcatのbin/startup.batなどを叩いてTomcat6を起動する。
  5. http://localhost:8080/sastruts/ にアクセスする。

これでWebアプリケーションが動き始めます。
今回はSAStrutsを使いましたが、別に何でも構いません。


VisualVMの起動

  1. https://visualvm.dev.java.net/ よりVisualVM1.0RCをダウンロードして解凍する。
  2. bin/visualvm.exeを実行してVisualVMを起動する。


これでVisualVMが起動しました。
なお、初回起動の場合はキャリブレーションが実行されます。



「Local」の下にいる「Tomcat」をダブルクリックすれば、JVMの情報などを確認できます。
右クリックメニューから、スレッドダンプ取得やプロファイリングなどが行なえます。



Java5でTomcatを動かすと、右クリックメニューには
スレッドダンプ取得やプロファイリングなどは出てきません。



[Monitor]タブでは、メモリ使用率やスレッド数を確認することができます。



[Threads]タブでは、稼動中の全スレッドを見ることができます。



DBアクセスを行なった直後。HSQLDBが動き始めたことが分かります。



特定のスレッドをダブルクリップすれば、どれぐらい稼動したりスリープしたかを確認できます。



[Profiler]タブで「CPU」をクリックして、アプリケーションを動かすと
メソッドごとの処理時間と処理発生回数を取得してくれます。
FileSync.syncというメソッドが1回の処理で随分時間を使っているようですが
この処理時間には、Sleepなんかもきっと含まれてるんでしょうね。


ちなみに、「CPU」をクリックした直後にアプリケーションを動かすと
随分と処理に時間が掛かってしまうのですが、
この際にオンデマンドアタッチで、プロファイリング用のバイトコードが埋め込まれるようです。


いったんバイトコードが埋め込まれてしまうと、体感には差が感じられません。
プロファイリングによるオーバーヘッドは随分と小さそうです。



今度は[Profiler]タブで「Memory」をクリックしてみましょう。


、、、あれ?
なんか音もなくTomcatが落ちてしまいました。
Tomcatを再起動して、もう一度同じ処理を試してみましたが
やはり結果は同じ。

#
# An unexpected error has been detected by Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d902e7d, pid=16636, tid=19668
#
# Java VM: Java HotSpot(TM) Client VM (10.0-b19 mixed mode, sharing windows-x86)
# Problematic frame:
# V [jvm.dll+0x92e7d]
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#

EXCEPTION_ACCESS_VIOLATIONが発生してしまったようですね。
ということで、今日はここまでにしましょう。