Skip to main content link. Accesskey S
  • Help
  • HCL Logo
  • HCL Notes and Domino Application Development wiki
  • THIS WIKI IS READ-ONLY. Individual names altered for privacy purposes.
  • HCL Forums and Blogs
  • Home
  • Product Documentation
  • Community Articles
  • Learning Center
  • API Documentation
Search
Community Articles > 日本語 - Japanese > Eclipse Memory Analyser Tool を使用した、XPages のメモリリークの調査
  • Share Show Menu▼
  • Subscribe Show Menu▼

Recent articles by this author

JMeter で XPages アプリケーションをテストする、入門編

JMeter を初めて使う方にむけて、Domino アプリケーションや XPages アプリケーションを JMeter でテストをするための手順を最初のステップから解説します。

Eclipse Memory Analyser Tool を使用した、XPages のメモリリークの調査

Java アプリケーションのメモリリークを調査する強力なツールである Eclipse Memory Analyser Tool を使用して、XPages アプリケーションのメモリリークを調査する方法について紹介します。

XSP クライアントサイド Javascript オブジェクト関数

XPages アプリケーション開発の中で利用できる、XSP クライアントサイド Javascript オブジェクト関数について解説します。

Lotus Notes Java クラスのリサイクルとメモリ消費の検証

XPages や Java エージェントなどで Lotus Notes を操作する Lotus Notes Java クラスでは、開発者が明示的にリサイクルをして使用したオブジェクトを開放する必要があります。このリサイクルを適切に行わないことで、Java クラスの

XPages アプリケーションでの「可視(rendered)」プロパティによるパフォーマンス低下への対策

XPages アプリケーション開発で、「可視」設定ので「値の計算」はパフォーマンス低下を招く可能性があります。「可視」評価の Javascript に複雑な処理を実装する必要があるときには、そのスクリプトでパフォーマンスの低
Community articleEclipse Memory Analyser Tool を使用した、XPages のメモリリークの調査
Added by ~Justin Elwemarynds | Edited by ~Justin Elwemarynds on June 26, 2013 | Version 12
  • Actions Show Menu▼
expanded Abstract
collapsed Abstract
Java アプリケーションのメモリリークを調査する強力なツールである Eclipse Memory Analyser Tool を使用して、XPages アプリケーションのメモリリークを調査する方法について紹介します。
Tags: XPages MAT
ShowTable of Contents
HideTable of Contents
  • 1 はじめに
  • 2 Eclipse Memory Analyser Tool の準備
    • 2.1 Eclipse Ganymede SR2 (3.4.2) のインストール
    • 2.2 Eclipse Memory Analyzer Tool (MAT) のインストール
    • 2.3 IBM Diagnostic Tool Framework for Java のインストール
  • 3 本記事のサンプルプログラム
  • 4 ヒープダンプの取得と MAT でのロードの方法
    • 4.1 ヒープダンプの取得
    • 4.2 ロードの方法
  • 5 ヒープダンプの解析
    • 5.1 Leak Suspects
    • 5.2 Dominator Tree

はじめに

Java ヒープダンプは、Java 仮想マシンのヒープメモリにある Java オブジェクトの現在の状態ダンプです。ヒープダンプはバイナリのデータで、それを読むためには Eclipse Memory Analyser Tool (http://www.eclipse.org/mat) が必要になります。
Domino で取得できるヒープダンプは IBM JVM のヒープダンプフォーマットで書かれているため、Eclipse Memory Analyser Tool に IBM の提供するプラグインである IBM Diagnostic Tool Framework for Java Version 1.10 (http://www.ibm.com/developerworks/java/jdk/tools/dtfj.html) を追加する必要があります。

 

Eclipse Memory Analyser Tool の準備

この記事では実際に XPages アプリケーションでメモリリークを起こさせて、それが MAT でどのように発見できるかを見てみます。試した環境は以下になります。

Domino: IBM Domino 8.5.3 FP3

MAT 環境:
    Eclipse Ganymede SR2 - Eclipse IDE for Java EE Developers
    Eclipse Memory ANalyzer Tool 1.2.1
    IBM Diagnostic Tool Framework for Java Version 1.10

 

Eclipse Memory Analyzer Tool は Eclipse IDE のプラグインとしても、単体の RCP プログラムとしても公開されています。
ここでは Eclipse IDE の上にプラグインとして構成し、さらに IBM Diagnostic Tool Framework for Java を追加でインストールする方法を紹介します。
 

Eclipse Ganymede SR2 (3.4.2) のインストール

現在リリースされている Eclipse IDE にはすでに 4.2 ですが、IBM Diagnostic Tool Framework for Java Version 1.10 のページで Eclipse 3.4 をベースにした記載があるため、筆者は Eclipse Ganymede SR2 (3.4.2) のダウンロードサイトより Eclipse IDE for Java EE Developer をダウンロードして使用しました。

 

Eclipse Memory Analyzer Tool (MAT) のインストール

展開した Eclipse IDE を開き、メニューから「Help」→「Software Updates」を選択し、「Available Software」タブを選択します。「Add Site」ボタンでダイアログを開き、Eclipse Memory Analyser Tool (http://www.eclipse.org/mat) の Memory Analyzer 1.2.1 Release のダウンロードページにある アップデートサイトの URL (http://download.eclipse.org/mat/1.2/update-site/)を指定して MAT のプラグインをインストールします。

 

IBM Diagnostic Tool Framework for Java のインストール

 IBM Diagnostic Tool Framework for Java Version 1.10 (http://www.ibm.com/developerworks/java/jdk/tools/dtfj.html) ページより「for Eclipse 3.4」の説明に従ってインストールを行います。

 

本記事のサンプルプログラム

この記事では実際に XPages アプリケーションでメモリリークを起こさせて、それが MAT でどのように発見できるかを見てみます。

サンプルとして使用するのは以下のような XPage アプリケーションです。このアプリションでは入力フィールドに設定されたサイズの配列のデータを作成しスコープ変数の applicationScope 変数に値を設定します。アプリケーションスコープの変数は、XPages アプリケーションとしてデータを保持するので、大きな値を設定することでメモリを圧迫させることができます。この記事での動作確認では入力フィールドに「500」を設定し、500MB のデータを生成しました。

	

		<?xml version="1.0" encoding="UTF-8"?>

		<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

		  <xp:label value="Leak data size: " id="label1"></xp:label>

		  <xp:inputText id="inputRepeatCount" required="true">

		      <xp:this.converter>

		          <xp:convertNumber type="number"></xp:convertNumber>

		      </xp:this.converter>

		      <xp:this.validators>

		          <xp:validateRequired message="Data size is mandatory,"></xp:validateRequired>

		          <xp:validateLongRange minimum="1" maximum="1000"></xp:validateLongRange>

		      </xp:this.validators>

		  </xp:inputText>

		  <xp:label value="MB" id="label2"></xp:label>

		  <xp:button value="Generate Memory Leak" id="buttonGenMemLeak">

		      <xp:eventHandler event="onclick" submit="true"

		          refreshMode="partial" refreshId="panelMessage">

		          <xp:this.action><![CDATA[#{javascript:

		var repeat = getComponent("inputRepeatCount").getValue();

		print ("Generating memory leak with " + repeat + " MB.");

		

		var testdata_16 = "0123456789ABCDEF";

		var testdata_1024 = "";

		for (i=0; i<64; i++) {

		  testdata_1024 = testdata_1024 + testdata_16;

		}

		

		var listsize = 1024 * repeat;

		var list = new Array(listsize);

		for (j=0; j< listsize; j++) {

		   list[j] = testdata_1024;

		}

		applicationScope.testdatalist = list;

		viewScope.message = list.length + "x1024 bytes data was stored in applicationScope.";

		           }]]></xp:this.action>

		       </xp:eventHandler>

		   </xp:button>

		   &#160;

		   <xp:button value="Clear Memory Leak" id="buttonClearMemLeak">

		       <xp:eventHandler event="onclick" submit="true"

		           refreshMode="partial" disableValidators="true" refreshId="panelMessage">

		           <xp:this.action><![CDATA[#{javascript:

		applicationScope.testdatalist = null;

		viewScope.message = "ApplicationScope data is cleared.";

		           }]]></xp:this.action>

		       </xp:eventHandler>

		   </xp:button>

		   <xp:br></xp:br>

		   <xp:panel id="panelMessage">

		       <xp:text escape="true" id="computedField1" value="#{viewScope.message}"></xp:text>

		   </xp:panel>

		</xp:view>
	

		

 

なお、解析対象のヒープメモリには Java のクラスの情報しか載ってきません。MAT は JVM の解析用のツールなので、XPages やサーバーサイド JavaScript を直接解析することはできません。MAT を使用した XPages の解析では、XPages が JavaServer Faces のフレームワークで動いていることを理解する必要があります。

Domino Designer でメニューから「ウィンドウ」→「Eclipse ビューの表示」でパッケージエクスプローラーを表示することで、XPages から生成された Java クラスを見ることができます。今回作成した XPage は「MyXPagesApp」で、それから生成された Java クラスは xsp.MyXPageApp.java となっています。このあとで説明する MAT でメモリ解析の際には、この Java クラスを見ながら行うことになります。

Domino Designer パッケージエクスプローラー

 

 

ヒープダンプの取得と MAT でのロードの方法

ヒープダンプの取得

Domino サーバーの JVM のヒープダンプは、Domino コンソールから以下の XSP マネージャーコマンドで生成することができます。生成されたヒープダンプは、Domino のプログラムディレクトリに heapudump_<日付>.<時刻>.<ミリ秒>.<連番>.phd のファイル名で生成されます

	

		tell http xsp heapdump
	

		

このコマンドの小先は「XPages Portable Command Guide」の「Chapter 3. Working with the Console / How to Execute the XSP Command Manager Commands」に記載されています。

 

ロードの方法

生成されたヒープダンプは MAT と IBM Diagnostic Tool Framework for Java を導入した で解析できます。Eclipse IDE を起動し、、メニュより「File」→「Open File」から生成したヒープダンプファイルを選択します。「Getting Start Wizard」で「Leak Suspects Report」を選択して「Finishi」をクリックします。

Getting Start Heap Dump

 

ヒープダンプが読み込まれるとともに、解析用の INDEX ファイルが同じフォルダに作成されます。また解析結果をポータブルに持ち運べるように ZIP ファイルも作成されます。

ヒープダンプの解析

Leak Suspects

ヒープダンプが読み込まれるとメモリリークの疑われるコンポーネントがグラフで表示され、詳細情報へのリンクが表示されます。

ただしここに表示されるのはメモリの使用量の多い物を示しているだけで、本当にメモリリークかどうかは自身で判断する必要があります。また、実際にメモリリークが起こっているときでもその量が大きくなければここでは表示されないことがあります。そのときには、このあとで紹介する Dominator Tree などで埋もれているメモリリークを探す必要があります。

この例では意図的にメモリリークを生成しているので「Suspect1」がメモリリークに該当します。「Suspect2」と「Suspect3」はこの場合は XPages フレームワークの正常な動作です。
 

Leak Suspects view

 

「Suspect1」の「Detail」をクリックすることでこの詳細が表示されます。

ここでは 2,000,000 を超える極端に大きなヒープメモリを取っている Java のクラスがあり、XPages のクラスローダーから呼ばれていることが判ります。そして、それを呼び出しているのが xsp.MyXPagesApp クラスです。

Problem Suspect

 

Dominator Tree

先ほども書いたように、占有しているメモリの量がそれほど大きくないときには Leak Suspects には現れないことがあります。そのときには Dominator Tree でメモリの使用量を見てメモリリークをしている箇所を探すことになります。

Open Dominator Tree

 

以下の Dominator Tree の例では、NSFComponentModule が大きなヒープメモリを占有しており、その大半が Vector に使用されています。このインスタンスから「Path to GC Roots」を選択して親を探します。すると先ほどと同じように xsp.MyXPagesApp クラスが見つかります。

Dominator Tree
 
Path to GC

この例でははっきりと判るメモリのリークを生み出して調べてみました。実際の環境では微妙なサイズのメモリリークが複数存在することになり、Dominator Tree などでメモリの量を見ながらひとつひとつ原因を究明することになります。

 


  • Actions Show Menu▼


expanded Attachments (0)
collapsed Attachments (0)
Edit the article to add or modify attachments.
expanded Versions (12)
collapsed Versions (12)
Version Comparison     
VersionDateChanged by              Summary of changes
This version (12)Jun 26, 2013, 5:25:03 AM~Justin Elwemarynds  
11Jun 26, 2013, 5:21:50 AM~Rebecca Minfreevitchobu  
10Jun 25, 2013, 1:26:28 PM~Rebecca Minfreevitchobu  
9Jun 25, 2013, 1:13:57 PM~Rebecca Minfreevitchobu  
8Jun 25, 2013, 1:13:29 PM~Rebecca Minfreevitchobu  
7Jun 25, 2013, 1:00:09 PM~Rebecca Minfreevitchobu  
6Jun 25, 2013, 12:55:25 PM~Rebecca Minfreevitchobu  
5Jun 25, 2013, 12:51:05 PM~Rebecca Minfreevitchobu  
4Jun 25, 2013, 12:47:16 PM~Rebecca Minfreevitchobu  .
3Jun 25, 2013, 12:40:37 PM~Rebecca Minfreevitchobu  
2Jun 25, 2013, 12:39:13 PM~Rebecca Minfreevitchobu  
1Jun 25, 2013, 10:49:49 AM~Rebecca Minfreevitchobu  
expanded Comments (0)
collapsed Comments (0)
Copy and paste this wiki markup to link to this article from another article in this wiki.
Go ElsewhereStay ConnectedAbout
  • HCL Software
  • HCL Digital Solutions community
  • HCL Software support
  • BlogsDigital Solutions blog
  • Community LinkHCL Software forums and blogs
  • About HCL
  • Privacy
  • Accessibility