SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

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

WebSphere Application Serverのチューニング 2

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

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]

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
ヒープダンプの解析

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

佐藤 龍之介(サトウ リュウノスケ)

某SIer にて、主にWeb系開発プロジェクトに従事。 趣味はラーメン食べ歩き。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1633 2007/09/03 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング