はじめに
J2EE開発者にとって、「セッションは小さく」設計するのが定石ですよね。では実際にセッションサイズはどう測るのでしょうか? ほとんどの方が「予測」で済ませているのが実情です。しかし、実際に測ってみるとさまざまなことが見えてきます。
本稿では、商用J2EEサーバとしてシェアの高いWebSphere Application Serverを想定し、オブジェクトのサイズを計測する方法と、その応用としてメモリリークを検出する方法を説明します。
対象読者
WebSphere Application Serverを利用したシステム開発に携わる、開発者・アーキテクト。
必要な環境
- サーバ
- 解析用PC
IBM JDK 5.0は、developerWorksのWebページからダウンロードできます。Eclipseとセットになっています。
解析ツール
IBMのalphaWorksで配布されているHeapAnalyzerを使います。
執筆時点(2007/8/15)での最新版は1.5です。ダウンロードした後、適当なフォルダに解凍しておきます。中の「ha15.jar」が本体です。起動方法は後述します。
計測環境の準備
「ヒープダンプ」(ヒープメモリ内のオブジェクトの一覧)を取得し、HeapAnalyzerで解析します。ヒープダンプの取得は次の条件で行ってください。
- サーバを再起動すること。ヒープ上に「ゴミ」がない状態にします。
- 計測者以外のユーザーにサーバへアクセスさせないこと。誰かがサーバにアクセスしていると、誰のセッションを計っているのか分からなくなります。
ヒープダンプの取得
詳細な説明は、IBM Information Centerを参照してください。ここでは手順だけを説明します。
ヒープダンプの取得はコマンドラインから行います。サーバが起動している状態で、wsadminコマンドを起動します。wsadminコマンドの実体は、windowsなら「wsadmin.bat」というバッチファイル、Unix系なら「wsadmin.sh」というシェルスクリプトです。これらのファイルは、以下の場所にあります。
- wsadminコマンドがある場所
<WAS導入ディレクトリ>\profiles\<サーバディレクトリ>\bin
C:\Program Files\IBM\WebSphere\AppServer\profiles\AppSrv01\bin
wsadminコマンドを起動すると、メッセージが表示されます。
C:\Program Files\IBM\WebSphere\AppServer\profiles\AppSrv01\bin >wsadmin.bat WASX7209I: ノード Node01 のプロセス "server1" に、SOAP コネクターを 使って接続しました。プロセスのタイプは UnManagedProcess です。 WASX7029I: ヘルプを表示する場合は、「$Help help」と入力してください。 wsadmin>
この場合は、サーバ名が「server1」、ノード名が「Node01」です。
「wsadmin>」というコマンドプロンプトが表示されます。このプロンプトからJaclというスクリプト言語で処理を行います。Jaclを覚える必要はありません。深く考えず、以下のように打ち込んでください。
wsadmin>set objectName [$AdminControl queryNames WebSphere:type=JVM, process=server1,node=Node01,*] WebSphere:name=JVM,process=server1,platform=proxy,node=Node01, j2eeType=JVM,J2EEServer=server1,version=6.1.0.0,type=JVM, mbeanIdentifier=JVM,cell=Node01Cell,spec=1.0 wsadmin>
ここまでで準備完了です。ヒープダンプの取得は、取得したいポイントで次のコマンドを打ち込みます。
wsadmin>$AdminControl invoke $objectName generateHeapDump
ヒープダンプはサーバディレクトリに出力されます。
- ヒープダンプの出力ディレクトリ
- ヒープダンプのファイル名
<WAS導入ディレクトリ>\profiles\<サーバディレクトリ>
C:\Program Files\IBM\WebSphere\AppServer\profiles\AppSrv01
heapdump.YYYYMMDD.HHMISS.<プロセスごとにユニークなID>.phd
heapdump.20070815.235501.2555.phd
HeapAnalyzerの起動
ヒープダンプをHeapAnalyzerで解析します。ダウンロードしたHeapAnalyzerを解凍すると、中にha15.jarというファイルがあります。これが本体です。以下のように、javaコマンドでHeapAnalyzerを起動します。
java -Xmx512m -jar ha15.jar
ヒープダンプの解析には十分なヒープサイズが必要です。-Xmxでヒープサイズを設定します。この例では512Mbytesに設定しています。起動するとheapAnalyzerのウィンドウが開きます。
取得したヒープダンプを読み込みます。