Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

オブジェクトサイズの計測とメモリリークの検出

WebSphere Application Serverのチューニング 2

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/09/03 14:00

J2EE開発者にとって、セッションオブジェクトは小さく設計するのが定石ですが、多くの場合で実際のサイズを計測せず、予測に止まっているのが実情です。本稿では商用J2EEサーバとしてシェアの高いWebSphere Application Serverを想定し、オブジェクトのサイズを計測する方法と、その応用としてメモリリークを検出する方法を説明します。

目次

はじめに

 J2EE開発者にとって、「セッションは小さく」設計するのが定石ですよね。では実際にセッションサイズはどう測るのでしょうか? ほとんどの方が「予測」で済ませているのが実情です。しかし、実際に測ってみるとさまざまなことが見えてきます。

 本稿では、商用J2EEサーバとしてシェアの高いWebSphere Application Serverを想定し、オブジェクトのサイズを計測する方法と、その応用としてメモリリークを検出する方法を説明します。

対象読者

 WebSphere Application Serverを利用したシステム開発に携わる、開発者・アーキテクト。

必要な環境

  • サーバ
  • WebSphere Application Server 6.0以上。
  • 解析用PC
  • IBM JDK 1.4.2以上がインストールされていること。メモリが1G以上あること。

 IBM JDK 5.0は、developerWorksのWebページからダウンロードできます。Eclipseとセットになっています。

解析ツール

 IBMのalphaWorksで配布されているHeapAnalyzerを使います。

 執筆時点(2007/8/15)での最新版は1.5です。ダウンロードした後、適当なフォルダに解凍しておきます。中の「ha15.jar」が本体です。起動方法は後述します。

計測環境の準備

 「ヒープダンプ」(ヒープメモリ内のオブジェクトの一覧)を取得し、HeapAnalyzerで解析します。ヒープダンプの取得は次の条件で行ってください。

  1. サーバを再起動すること。ヒープ上に「ゴミ」がない状態にします。
  2. 計測者以外のユーザーにサーバへアクセスさせないこと。誰かがサーバにアクセスしていると、誰のセッションを計っているのか分からなくなります。

ヒープダンプの取得

 詳細な説明は、IBM Information Centerを参照してください。ここでは手順だけを説明します。

 ヒープダンプの取得はコマンドラインから行います。サーバが起動している状態で、wsadminコマンドを起動します。wsadminコマンドの実体は、windowsなら「wsadmin.bat」というバッチファイル、Unix系なら「wsadmin.sh」というシェルスクリプトです。これらのファイルは、以下の場所にあります。

  • wsadminコマンドがある場所
  • <WAS導入ディレクトリ>\profiles\<サーバディレクトリ>\bin
    
    (例) windowsの場合
    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\<サーバディレクトリ>
    
    (例) windowsの場合
    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のウィンドウが開きます。

 取得したヒープダンプを読み込みます。

[File]-[Open]→(phdファイルを選択)→[Open]
[File]-[Open]→(phdファイルを選択)→[Open]

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5