(58)【調査した分野】(Int.Cl.,DB名)
アプリケーションの配備に伴って元プログラム読み込み機能を生成すると共に該元プログラム読み込み機能を用いて前記アプリケーションを構成するオブジェクト群であるプログラムおよびその元プログラムとが記憶領域に生成して実行される情報処理装置において、アプリケーションの実行に伴って更新される、記憶領域における前記オブジェクト群の参照関係を表す参照情報群に含まれるデータに基づいて、前記オブジェクト群を前記元プログラム読み込み機能を基準にしてグループ化するグループ化部と、
前記アプリケーションの終了に伴って破棄済みとマーキングされた破棄済みの元プログラム読み込み機能を基準にして、前記グループ化された情報に基づいてグループ化したグループに対して、該グループの外部から参照する参照元を特定する参照元特定部とを有すること特徴とするデータ参照元特定システム。
前記グループ化部は、前記参照情報群の更新データに基づいて、前記プログラムおよび前記元プログラムとを、前記元プログラムを読み込んだ前記元プログラム読み込み機能を基準にしてグループ分けすると共に、グループ分けの状態を表すグループ化情報を保持することを特徴とする請求項1に記載のデータ参照元特定システム。
前記参照元特定部は、前記参照情報群の更新データおよび前記グループ化部における前記元プログラム読み込み機能を基準にしてグループ分けした際のグループ化情報に基づいて、前記グループ化された破棄済みの元プログラム読み込み機能のグループに対して該グループの外部から参照する参照元を特定することを特徴とする請求項1もしくは請求項2に記載のデータ参照元特定システム。
前記グループ化部は、前記破棄済みの元プログラム読み込み機能である破棄済みのクラスローダを、前記参照情報群を参照することにより特定する破棄済みクラスローダ探索モジュールと、
前記参照情報群であるヒープダンプテーブルと、前記特定された破棄済みのクラスローダの一覧とを基にグループ分けすると共に、グループ化情報であるグループ化テーブルを生成するグループ化モジュールとを含むことを特徴とする請求項1もしくは請求項2に記載のデータ参照元特定システム。
前記グループ化モジュールは、前記ヒープダンプテーブルおよび前記破棄済みクラスローダの一覧に基づいて、ヒープダンプテーブルに含まれるレコードの種別が前記オブジェクトの場合には、該オブジェクトが属する前記クラスのオブジェクトIDを基にクラスのレコードを特定すると共に、特定したクラスローダのオブジェクトIDを基にグループ化テーブルにレコードを追加登録し、前記種別が前記クラスの場合には、その特定したクラスローダのオブジェクトIDを基にグループ化テーブルにレコードを追加登録し、前記種別が前記クラスローダの場合には、前記オブジェクトIDを基にグループ化テーブルにレコードの情報を追加登録し、前記種別がメモリ資源を解放するメモリ資源解放機能であるガベージコレクションを含むその他の場合には、何も処理をしないグループ分けを行うと共にグループ化テーブルを生成することを特徴とする請求項4に記載のデータ参照元特定システム。
前記データ参照元特定システムは、前記破棄済みとマーキングされたクラスローダのオブジェクト群が占有するメモリ資源を解放するガベージコレクションの参照開始点からの参照をも参照元としてグループ分けすることにより、その参照元を特定することを特徴とする請求項5に記載のデータ参照元特定システム。
前記グループ化モジュールは、明示的に破棄済みとマーキングされていなくとも前記破棄済みのクラスローダにのみ依存するクラスローダを前記破棄済みのクラスローダと見なしてグループ分けするとともに、前記グループ化テーブルを生成することを特徴とする請求項4に記載のデータ参照元特定システム。
アプリケーションの配備に伴って元プログラム読み込み機能を生成すると共に該元プログラム読み込み機能を用いて前記アプリケーションを構成するオブジェクト群であるプログラムおよびその元プログラムとが記憶領域に生成して実行される情報処理装置において、
アプリケーションの実行に伴って更新される、記憶領域におけるオブジェクト群の参照関係を表す参照情報群に含まれるデータに基づいて、前記オブジェクト群を前記元プログラム読み込み機能を基準にしてグループ化し、
前記アプリケーションの終了に伴って破棄済みとマーキングされた破棄済みの元プログラム読み込み機能を基準にして、前記グループ化された情報に基づいてグループ化したグループに対して、該グループの外部から参照する参照元を特定する
ことを特徴とするデータ参照元特定方法。
アプリケーションの配備に伴って元プログラム読み込み機能を生成すると共に該元プログラム読み込み機能を用いて前記アプリケーションを構成するオブジェクト群であるプログラムおよびその元プログラムとが記憶領域に生成して実行される情報処理装置を制御するコンピュータ・プログラムであって、そのコンピュータ・プログラムにより、
アプリケーションの実行に伴って更新される、記憶領域における前記オブジェクト群の参照関係を表す参照情報群に含まれるデータに基づいて、前記オブジェクト群を前記元プログラム読み込み機能を基準にしてグループ化するグループ化機能と、
前記アプリケーションの終了に伴って破棄済みとマーキングされた破棄済みの元プログラム読み込み機能を基準にして前記グループ化された情報に基づいてグループ化したグループに対して、該グループの外部から参照する参照元を特定する機能とを、
コンピュータに実現させることを特徴とするコンピュータ・プログラム。
【背景技術】
【0002】
今日、企業の業務や、社会生活で必要なサービスは、例えば通信ネットワークを介したアプリケーション(Application;以下、アプリケーションもしくは、「AP」と称する)サーバによって提供されるようになっている。そして、ユーザは、利用可能な情報端末から、通信ネットワークを介してAPサーバにアクセスすることによって企業の業務ソフトウェアやインターネットサービスを利用することができる。
【0003】
そしてこれらのサービスを提供するAPサーバにおいて動作するソフトウェアは、取り扱うさまざまな種類のデータとそのデータに関連するコードを一体的に扱うオブジェクト指向のプログラム言語を用いて開発したAPが用いられている。
【0004】
例えばJava(登録商標。以下、同様) Enterprise Edition(Javaの企業用機能セット。以下、単に「Java」もしくは、「Java_EE」と略称する。)に準拠したAPサーバは、自身に有するJava Virtual Machine(Java 仮想マシン。以下、「Java_VM」と略称する)において、複数のアプリケーションを独立に動作させることができる。
【0005】
そのため、APサーバは、何れかのAPを必要に応じて配備する。これにより、そのAPは、APサーバの管理下に置かれると共に、不要となったAPは、APサーバから、その配備を取り外すことにより、そのAPはAPサーバの管理下から除外される。
【0006】
つまり、APサーバは、あるAPを配備すると、そのAP専用のクラスローダと呼ばれるプログラムの元となる元プログラムを読み込むための元プログラム読み込み機能を個別に生成すると共にそのAPに関連付ける。そしてAPサーバは、そのAPに関連付けされた元プログラム読み込み機能であるクラスローダを利用して、APを構成する元プログラムであるクラスや、プログラムであるオブジェクトを、APサーバが有するJava_VMのメモリ領域に動的に配備(つまりロード)する。
【0007】
ここでクラスとは、Java_VMにおいて複数のデータ型の組み合わせを定義すると共に、その定義したデータ型に基づいて確保したメモリ領域において動作するオブジェクトを生成する元となる設計図である。また、オブジェクトとは、設計図であるクラスを基に、Java_VMが有するメモリ領域において動作するデータとそのデータに関連するコードを一体的に構成したプログラムの実体である。
【0008】
そして、APサーバは、メモリに展開されたクラスやオブジェクトとからなるAPを実行状態にすると共に、リクエストの受け付けを開始する。なお、リクエストとは、APサーバからAPを実行するためのAPサーバへの要求である。
【0009】
すなわち、
図2に示す、背景技術としてのAPサーバのソフトウェア構成を示す図にあるように、APサーバ20は、動作させたいAP1をクラスローダ21に配備することによってAP1と関連付けると共に、AP1を構成するクラス22とオブジェクト21とを図示していないメモリ上に展開することによってAP1を動作させる。
【0010】
ここで、クラスローダの生成について、
図3を用いて具体的に説明する。Java_EEに準拠したAPサーバには、配備されたAPが共通に利用する共通クラスローダ群2−1が存在する。共通クラスローダ群2−1は少なくとも一つ以上のクラスローダで構成されており、基本的には親子関係をもつ階層構造を有している。
【0011】
なお、APサーバは、Open Services Gateway initiative(以下、「OSGi」と略称する)のフレームワークに代表されるようなネットワーク状に結合した構造を有している場合もある。
【0012】
APサーバに対してAPを配備すると、APサーバは、配備したAPをロードするための専用のクラスローダを、共通クラスローダ群2−1の子のクラスローダとして生成し、APに関連付ける。
【0013】
図3では、APサーバに3つのAPが配備されている状況を示しており、各APごとに専用のクラスローダ2−2、2−3、2−4を有している。
【0014】
また、APサーバはAPを停止状態にするか、あるいは配備を取り外すか、もしくはリクエストの受け付けを行わないようにすることによって、そのAPの動作を取りやめることもできる。
【0015】
そして、APサーバはAPの動作を取りやめる際に、APに関連付けているクラスローダがもはや不要となるので、APサーバによってメモリ領域などの対応するリソースを解放するために、そのクラスローダに対して破棄処理を実施すると共に、破棄済みの旨をマーキングする。
【0016】
そして、APサーバは、APを構成するクラスやオブジェクトに対する参照を切断すると共に、それらをガベージコレクション(Garbage Collection;以下、「GC」と称する)の対象とする。
【0017】
ここで、GCの対象にするとは、メモリに存在するクラスやオブジェクトの参照関係を示す参照先を矢印で示す有向グラフにおいて、GCルートと呼ばれている参照元を矢印の起点とする有向グラフの開始地点からの到達を到達不能にすることである。
【0018】
GCの対象について、
図4を用いて具体的に説明する。
図4に示す3−1と3−2は、GCルートを示している。3−3がGCルートから有向グラフを辿って到達可能な範囲を示している。
【0019】
ここで、クラスやオブジェクトがGCの対象になるということは、クラスやオブジェクトのプログラムに用いる変数の値にNull(すなわち変数の値が無いことを意味する)を代入したり、実行中のスレッドを停止したりすることで、3−1、3−2、3−3から到達不能にすることである。
【0020】
そして、3−4のように3−1、3−2、3−3と全く関わりを持たなくなった孤立した参照関係を有する部分グラフはGCの対象となる。また3−5は3−3と結合しているが、辺の矢印の向きが3−5から3−3に向かうもののみであり、3−1、3−2、3−3からは到達不能なので、GCの対象である。
【0021】
しかしながら、APは、APサーバがAPを停止するか、配備の取り外しか、もしくはリクエストの受付を行わないようにしようとしても、APの不具合等によりそのAPを構成するクラスやオブジェクトがGCルートから到達不能にならない(すなわち、到達することができてしまう)場合がある。
【0022】
そのような場合は、APを構成するクラスやオブジェクトが意図せずにメモリに残存し続けることになり、このような現象をメモリリークと呼ぶ。このメモリリークを放置しておくとメモリ領域が枯渇する恐れがあり、APサーバおよびAPの動作異常に繋がる。
【0023】
そのために、Javaのアプリケーションにおいて、メモリリークの原因を特定するためには、起動時にJava_VMから共通的なメモリ領域であるヒープ領域が割り当てられたのちに、Java_VMの実行中にはヒープダンプと呼ばれるAPを実行する際に必要となる参照関連のデータをファイルとして取得すると共に、そのファイル内容を解析することにより参照元を辿ることができる。
【0024】
つまり、ヒープとは、APサーバが動的に確保したオブジェクトを格納するメモリ領域である。
【0025】
またヒープダンプとは、そのメモリ領域のデータの内容を表示した一覧であり、例えばGCルートと、クラスをロードしたクラスローダと、クラスと、クラスが生成したオブジェクトとを表すIDやアドレス情報およびこれらのオブジェクトの参照関係の情報が保持されている。
【0026】
そして、クラスやオブジェクトの参照関係を調べるためにはこれらの情報を入力として解析する必要がある。
【0027】
ここで、データとして取り扱うクラスローダ、クラス、オブジェクトおよびオブジェクトの一種であるGCルート(すなわちGCの開始点)を表すIDやアドレス情報を総称する際には、単に「オブジェクト」もしくは「オブジェクト群」と呼ぶ場合がある。
【0028】
また、プログラムとしてのオブジェクトは「プログラム」もしくは「プログラムオブジェクト」と呼ぶこととする。
【0029】
上述したような問題を解決するため、特許文献1に記載の技術は、Java_VMで発生するメモリリークの原因を、オブジェクトの参照関係を辿ることにより、メモリリークが発生する危険性を検出することで原因箇所を特定しやすくする技術を開示する。
【0030】
また、特許文献2に記載の技術は、データ領域に設定する状態規則に反するデータを見つけ、そのデータに設定する参照規則に反する参照関係からメモリリークを検出する技術を開示する。
【発明を実施するための形態】
【0044】
以下、本発明を実施する形態について図面を参照して詳細に説明する。
【0045】
<第1の実施形態>
本発明の第1の実施形態の構成について説明する。
図1は、本発明の第1の実施形態に係るデータ参照元特定システムの概要を示すブロック図である。
【0046】
本実施形態のデータ参照元特定システム10は、グループ化部1と、参照元特定部2と、参照情報群3とからなる。
【0047】
また、
図2は背景技術としてのアプリケーション(以下、「AP」と称する)サーバのソフトウェア構成を示す図である。本背景技術のAPサーバ20は、プログラム23の設計図である元プログラム22を読み込む、元プログラム読込み機能21と、元プログラム22と、プログラム23とを有する。
【0048】
図1に示す、グループ化部1は、データ参照元特定システム10が動作する際の図示していないメモリにある情報の一部を記憶する参照情報群3の情報に基づいて、元プログラム読込み機能21を基準として、元プログラム22と、プログラム23とをグループ化する。
【0049】
ここで、参照情報群3とは、APサーバ20において、図示していないメモリにある元プログラム読込み機能21と、元プログラム22およびプログラム23を識別するためのIDやアドレス情報を、外部装置もしくは運用管理者による自動もしくは手動による指示によって取り込まれる情報群のことである。
【0050】
参照元特定部2は、参照情報群3に基づいて、何れかのアプリケーションの終了に伴って破棄されることにより“破棄済み”とマーキングされた元プログラム読み込み機能21を基準として、上述したグループ化部1によってグループ化された元プログラム22とプログラム23とを含む破棄済み元プログラム読み込み機能のグループをそのグループの外部から参照する参照元のプログラムの識別子(すなわち、ID)やアドレス情報を特定する。
【0051】
また、破棄済みの元プログラム読み込み機能21を基準としてグループ化されたグループの元プログラム22やプログラム23が占有するAPサーバのメモリ資源を解放する図示していないメモリ開放機能が参照するその参照元のプログラムのIDやアドレス情報をも特定する。
【0052】
なお、参照情報群3におけるグループ化対象である元プログラム読み込み機能21と、元プログラム22と、プログラム23および図示していないメモリ開放機能の参照開始点からの参照に関するIDやアドレス情報は、説明の便宜上「グループ化対象データ」と称することとする。
【0053】
また、参照情報群3は、本データ参照元特定システム10に有することを限定しているわけではなく、本データ参照元特定システム10を含むAPサーバが有していてもかまわない。
【0054】
次に、本実施形態のデータ参照元特定システム10の動作について説明する。本データ参照元特定システム10は、図示していない外部装置もしくは、運用管理者によって自動もしくは手動によって起動されると共に、その動作に応じて図示していないメモリにある、プログラムである元プログラム読み込み機能21と、元プログラム22と、プログラム23および、図示していないメモリ開放機能の参照を開始するオブジェクト群を識別するためのIDやアドレス情報である参照情報群3を生成または更新する。
【0055】
そして、本データ参照元特定システム10のグループ化部1は、生成または更新された参照情報群3のデータに基づいて、上述した元プログラム読み込み機能21と、元プログラム22と、プログラム23および図示していないメモリ開放機能の参照開始点を表すIDやアドレス情報からなるグループ化対象データを、当該プログラム23が属する当該元プログラム22を読み込んだ元プログラム読み込み機能21を基準にしてグループ化する。
【0056】
そして、本データ参照元特定システム10の参照元特定部2は、何れかのアプリケーションの終了に伴って、図示していない破棄済みとマーキングされた破棄済みの元プログラム読み込み機能を基準にして前記グループ化された際の情報に基づいてグループ化したグループに対して、そのグループの外部から参照する参照元を特定する。
【0057】
上述したグループ分けによって、参照先の元プログラムやプログラムのサイズや個数に依らずに、APサーバ20に配備されたアプリケーションを停止あるいは取り外した際に、破棄済みとマーキングされた元プログラム読み込み機能21である破棄済み元プログラム読み込み機能のグループをそのグループの外部から直接的に参照する元プログラム22およびプログラム23を特定することができる。
【0058】
また、グループの外部から直接的に参照することができる参照元は、破棄済み元プログラム読み込み機能が有する元プログラム22およびプログラム23が占有するAPサーバのメモリ資源を解放するメモリ資源解放機能の参照開始点からの参照をもその参照元として特定することができる。
【0059】
すなわち本実施形態によれば、参照元のプログラムを直接的に特定することができるので、参照先のプログラムのサイズが小さいか、もしくは個数が少ない場合でもメモリリークの直接の原因となる参照元のプログラムを特定することができるという効果を奏することができる。
【0060】
また、本実施形態によれば、参照先のプログラムのサイズが小さいか、もしくは個数が少ない場合でもメモリリークの直接の原因となる参照元のプログラムを効率的に特定することができるので、例えば開発や評価途上での長時間動作試験などを実施しなくてもメモリリークを容易に検出することができるという効果を奏することができる。
【0061】
さらに、本実施形態によれば、APにおける複数の時点での参照情報群を比較して元プログラムやプログラムの増減を観察する必要がなく、ある時点での単一の参照情報を用いるだけでメモリリークの参照元のプログラムを特定することができるという効果を奏することができる。
【0062】
つまり、本実施形態によれば、参照先のプログラムのサイズが小さいか、もしくはプログラムの個数が少ない場合でもメモリリークの直接の原因となる参照元のプログラムを特定することができるという効果を奏することができる。
【0063】
以上、本発明の第1の実施形態として、上述した構成および動作を例に説明したが、本発明は、必ずしも係る構成や動作には限定されない。
【0064】
<第2の実施形態>
次に、第1の実施形態を基本とする本発明の第2の実施形態について
図7を参照してその構成を説明する。
図7は第2の実施形態に係るデータ参照元特定システムの機能を概念的に示すブロック図である。本ブロック図は、第2の実施形態のデータ参照元特定システムにおける課題を解決するために以下の3つの主要なモジュールからなる。
【0065】
すなわち、破棄済みクラスローダ探索モジュール6−3は、参照情報群3であるヒープダンプ6−2を入力として破棄済みクラスローダを探索するモジュールである。
【0066】
また、グループ化モジュール6−4は、破棄済みクラスローダの一覧およびヒープテーブル6−2を入力として破棄済みクラスローダのグループとそれ以外のグループとをグループ分けすると共にグループ化テーブル6−7を生成するモジュールである。
【0067】
そして、参照探索モジュール6−5は、ヒープダンプ6−2と、グループ化テーブル6−7を入力として、そのうちの破棄済みクラスローダのグループへの参照を示すグループ外からの参照テーブル6−8を生成すると共にその参照元を見つけるモジュールである。
【0068】
ここで、モジュールとは、例えば本データ参照元特定システム10のアプリケーションソフトウェアを構成する個々の処理機能である。また、これらのモジュールは、例えば後述する
図19に示すようなコンピュータのハードウェア資源において実行される。
【0069】
なお、第1の実施形態で説明した
図2における元プログラム読み込み機能21と、元プログラム22と、プログラム23は、第2の実施形態においては、それぞれクラスローダ、クラス、オブジェクトと呼ぶこととする。
【0070】
ここで、
図5および
図6を参照して上述した主要モジュールのうち、まず、破棄済みクラスローダの探索についてその概要から説明する。本実施形態に係るデータ参照元特定システム10であるAPサーバは、何れかのAPの停止などに伴って、不要となったクラスローダのリソース解放処理を行う。そして係るAPサーバは、当該不要となったクラスローダを“破棄済み”とマーキングする。
【0071】
本実施形態では、クラスローダが破棄済みとマーキングされることと、クラスローダがGCルートから到達不能になる以下の2つ条件を利用する。すなわち、
条件1は、そのクラスローダを直接的に参照するクラスやオブジェクトが存在しないこと、そして、
条件2は、そのクラスローダがロードしたクラス、およびそのクラスのオブジェクトがGCルートから到達不能であること。
である。
【0072】
上記条件について、
図5を用いて詳細に説明する。
図5は、本実施形態における破棄済みクラスローダと、GCルートから到達不能になる条件を説明する図である。上述した条件1は、GCの対象となって参照を切断するためには、GCルートから到達不能である必要がある。
【0073】
しかし、クラスローダXは、GCルートαから4−1、4−2という経路で到達可能であるため、4−1あるいは4−2またはその両方の参照を切断する必要がある。また、上述した条件2は、ソースコード上には現れないが、Java_VMが実行時にヒープダンプテーブルに追加する暗黙的な参照が存在するために必要になる条件である。
【0074】
ここで、暗黙の参照は具体的には二つあり、一つはクラスに対して、そのクラスをロードしたクラスローダへの暗黙の参照を追加することである。もう一つはオブジェクトに対して、そのオブジェクトのクラスへの暗黙の参照を追加することである。
【0075】
暗黙の参照は、
図5に示すように破線で示している。クラスAは、GCルートαから4−1、4−3という経路で到達可能であり、なおかつクラスAからクラスローダXへの暗黙の参照4−4が存在するため、クラスローダXが連鎖的に到達可能となる。
【0076】
また、クラスCのオブジェクト4−8は、GCルートαから4−1、4−5という経路で到達可能であり、なおかつオブジェクト4−8からクラスCへの暗黙の参照4−6と、クラスCからクラスローダXへの暗黙の参照4−7が存在するため、クラスローダXが連鎖的に到達可能となる。従ってこれらの参照を切断する必要がある。
【0077】
本実施形態では、クラスローダが破棄済みとマーキングされているにもかかわらず、上述した条件1および条件2を暗黙の参照も含めて満たしていない場合にメモリリークが発生していると判断する。そして、本実施形態では、上記条件を満たしていない事を判別するために、クラスローダを基準にして、そのクラスローダによってロードされたクラスと、そのクラスのオブジェクトをグループ化する。
【0078】
また、破棄済みのクラスローダのグループについてグループ外からグループ内への参照がある場合、これはGCの対象になっていないオブジェクトから、GCの対象になるべきオブジェクト、すなわち破棄済みのクラスローダの配下に存在するオブジェクトを参照していることを意味する。
【0079】
上述したグループ化および、グループ外からの参照について
図6を用いてさらに詳細に説明する。
図6は、本実施形態に係る破棄済みクラスローダへのグループ外から参照する例を説明する図である。
【0080】
図6に図示していないAPサーバは、クラスローダCLYにおいて、グループ化したクラスやオブジェクトのグループ5−1のクラスローダCLYが、破棄済みである旨のマーキングをしておらず、またGCの対象ではないものとする。
【0081】
これに対し、APサーバは、クラスローダCLXにおいて、そのクラスローダCLXを基準にしてグループ化されたクラスやオブジェクトのグループ5−2のクラスローダCLXが破棄済みである旨のマーキングをしているために、GCの対象にするべきものである。
【0082】
しかしながら、
図6に示すような以下の6つのケースにおいて、それらの参照をたどることにより、GCルート(つまり、
図6に示すGCR0とGCR1)からクラスローダCLXに到達可能であり、クラスローダCLXは、破棄済みにも関わらずGCの対象にできないという矛盾が生じる。すなわち、
1.グループ外からの参照であるGCルートGCR0から、クラスローダCLXへの参照5−3が存在することにより、GCルートGCR0から直接到達可能である。
【0083】
2.グループ外からの参照であるGCルートGCR0からクラスCX0への参照5−4が存在することにより、参照5−4、暗黙的な参照5−5という経路でGCルートGCR0から到達可能である。
【0084】
3.グループ外からの参照であるGCルートGCR0からオブジェクトOX0への参照5−6が存在することにより、参照5−6、暗黙的な参照5−7、暗黙的な参照5−5という経路でGCルートGCR0から到達可能である。
【0085】
4.グループ外からの参照であるオブジェクトOY4からクラスローダCLXへの参照5−10が存在することにより、参照5−8、参照5−9、参照5−10という経路でGCルートGCR1から到達可能である。
【0086】
5.グループ外からの参照であるオブジェクトOY5からクラスCX3への参照5−12が存在することにより、参照5−8、参照5−11、参照5−12、暗黙的な参照5−13という経路でGCルートGCR1から到達可能である。
【0087】
6.グループ外からの参照であるオブジェクトOY6からオブジェクトOX6への参照5−14が存在することにより、参照5−8、参照5−14、暗黙的な参照5−15、暗黙的な参照5−13という経路でGCルートGCR1から到達可能である。
【0088】
なお、
図4の3−4に示すように、参照がグループ内に閉じていれば、本本発明の実施形態が特定しようとするメモリリークに該当することはない。
【0089】
つまり、第1の実施形態本のデータ参照元特定システム10のグループ化部1および、後述する本実施形態のグループ化モジュール6−4において、上述した特性を利用してグループ分けを行う。
【0090】
なお、
図7に示す、本実施形態のグループ化モジュール6−4と、参照探索モジュール6−5およびヒープダンプ6−2は、それぞれ第1の実施形態のグループ化部1と、参照元特定部2と、参照情報群3とに対応する。
【0091】
引き続き、本発明の第2の実施形態について
図7乃至
図18を参照してさらに詳細に説明する。
図7は、本発明の第2の実施形態に係るデータ参照元特定システムの機能を概念的に示すブロック図である。
【0092】
本実施形態のデータ参照元特定システム10は、図示していないAPサーバにより破棄済みとマーキングされたクラスローダを探し出し、このクラスローダによってロードされたクラスおよびそのオブジェクトをグループ化すると共に、このグループ外からの参照を見つけることによってメモリリークの直接の原因となる参照を特定するシステムである。
【0093】
本発明の第2の実施形態の構成は、
図7において以下の構成からなる。
【0094】
入力装置6−1は、本実施形態のデータ参照元特定システム10を始動する指令を発生するユーザインタフェースである、例えばキーボード(Key Board;以下、「KB」と略称する)やマウスあるいは、本データ参照元特定システム10に接続する外部装置等である。
【0095】
次に、ヒープダンプ6−2(つまり、
図8に示すヒープダンプテーブル図に対応する。以下、同様)は、図示していないJava_VMがメモリ領域に生成したヒープダンプである。具体的には、
図8に示す本実施形態に係るヒープダンプテーブル図にあるように、このテーブルにはJava_VMにおけるGCルートと、クラスローダと、クラスと、オブジェクトおよびとの参照先を表す情報とが関連付けされた状態で格納されている。
【0096】
つまり、上述したオブジェクトの一種であるGCルートと、クラスローダと、クラスおよび、オブジェクトにID(つまりメモリアドレスなどのアドレス情報)を割り振り、オブジェクトID間の関係性を記録したテーブルがJava_VMが備えるヒープダンプテーブルである。
【0097】
以下、
図8に示すヒープダンプテーブルの6つの列について個々に説明する。すなわち、
1)オブジェクトID(IDは、すなわち識別子を意味する)は、レコードが示すオブジェクトを識別するIDである。
【0098】
ここで、レコードとは、データを格納する
図8に示すヒープダンプテーブルの様な表における各行ごとの個々の登録データを指す。
【0099】
2)種別は、そのレコードが保持するデータの種類であり、GCルート、クラスローダ、クラス、オブジェクトがある。
【0100】
3)クラスのオブジェクトIDは、そのオブジェクトが属するクラスを示すオブジェクトIDである。種別がオブジェクトの場合だけ値が存在する。
なお、種別がオブジェクト以外であれば、n/a(not applicable、すなわち、“該当せず”。以下、同様)と記載する。
【0101】
4)クラスローダのオブジェクトIDは、そのクラスをロードしたクラスローダを示すオブジェクトIDである。種別がクラスの場合だけ値が存在する。
【0102】
5)参照先のオブジェクトIDは、そのオブジェクトのクラスに直接宣言された変数であるフィールド等が参照しているオブジェクトのオブジェクトIDである。ここでフィールドとは、クラスの変数の中身のことである。また、
図8に示すヒープダンプテーブルの参照先のオブジェクトID欄にあるように、参照先のオブジェクトIDの個数は0個以上の参照を保持できるものとする。
【0103】
6)破棄済みか?欄は、そのクラスローダが破棄済みであるか否かを示す。レコードの種別がクラスローダの場合だけ値が存在する。
【0104】
次に、
図7に示すデータ参照元特定システムの機能を概念的に示すブロック図において、破棄済みクラスローダ探索モジュール6−3は、ヒープダンプ6−2を入力とし、APサーバにより破棄済みとマーキングされたクラスローダを探索し、その一覧を出力するモジュールである。
【0105】
また、グループ化モジュール6−4は、上述したヒープダンプ6−2と、破棄済みクラスローダ探索モジュールの出力である破棄済みクラスローダの一覧を入力とし、破棄済みクラスローダによってロードされたクラスおよびそのオブジェクトをその破棄済みクラスローダを基にグループ化すると共に、
図9に示すようなグループ化テーブル6−7を出力するモジュールである。
【0106】
また、参照探索モジュール6−5は、ヒープダンプ6−2と、グループ化テーブル6−7を入力とすることによって、グループ外のオブジェクトからグループ内に入ってくる参照元を特定すると共に、
図10に示すようなグループ外からの参照を表すテーブル6−8を出力するモジュールである。
【0107】
また、出力装置6−6は、本実施形態に係るデータ参照元特定システム10における処理結果を出力する装置である。本出力装置6−6は、例えば液晶ディスプレイやファイルシステムにおけるファイルや、本データ参照元特定システム10の外部に接続する外部装置等である。
【0108】
また、グループ化テーブル6−7は、グループ化モジュール6−4の出力結果であり、破棄済みクラスローダによってロードされたクラスおよびそのオブジェクトをグループ化したテーブルである。その具体的な内容について
図9に示す。
図9は、本実施形態に係るグループ化テーブル図である。
【0109】
そして
図10に示す、グループ外からの参照テーブル6−8は、グループ化モジュール6−4によって破棄済みクラスローダを基にグループ化したグループ化対象オブジェクトに対して、他の破棄済みではないクラスローダを基にグループ化したグループ化対象オブジェクトからの参照履歴を記録したテーブルである。
【0110】
続いて、
図7、
図11、
図12を用いて本データ参照元特定システム10の動作についての説明を行う。
【0111】
まず、
図7に示す、本実施形態に係るデータ参照元特定システムの機能を概念的に表すブロック図に示す、入力装置6−1において、本データ参照元特定システムを始動させるための指令を発生する。指令は例えば外部装置による自動や、KBやマウスなどを用いて手動により入力装置6−1から入力する。
【0112】
本データ参照元特定システム10は、自装置であるAPサーバによって破棄済みとマーキングされたクラスローダを探索するために、ヒープダンプ6−2を入力とし、破棄済みクラスローダ探索モジュール6−3の処理を実行する。そして、その破棄済みクラスローダ探索モジュール6−3は、破棄済みクラスローダの一覧(不図示)を出力する。
【0113】
また、グループ化モジュール6−4は、ヒープダンプ6−2と上述した破棄済みクラスローダの一覧を入力として呼び出される。
【0114】
そして、グループ化モジュール6−4は、破棄済みクラスローダを含むクラスローダによって、ロードされたクラスおよびそのオブジェクトをグループ化すると共に、グループ化テーブル6−7を出力する。
【0115】
そして、参照探索モジュール6−5は、ヒープダンプ6−2(つまり、
図8)に示すレコードの「参照先のオブジェクトID」が、グループ化テーブル6−7(つまり、
図9)に示す「配下のオブジェクトID」に一致するオブジェクトを特定すると共に、グループ外からの参照テーブル6−8(つまり、
図10)に登録する。
【0116】
すなわち、破棄したはずのクラスローダの配下のオブジェクトを、グループ外から参照先にしていることが直接的に判るわけである。
【0117】
出力装置6−6は液晶ディスプレイや、ファイルシステムにおけるファイル、もしくは外部のプログラムモジュールなどであり、入力であるグループ外からの参照テーブル6−8を出力装置6−6の種類に応じて出力する。
【0118】
引き続き、
図7に示すデータ参照元特定システムのブロック図におけるグループ化モジュール6−4のグループ分けの動作について、
図11を用いて詳しく説明する。
図11は本実施形態に係るグループ化モジュールの動作を示すフローチャートである。
【0119】
グループ化モジュール6−4は、ヒープダンプ6−2と、破棄済みクラスローダ探索モジュール6−3からの破棄済みクラスローダの一覧の入力に応じて、開始(ステップS10−1)より始まる。グループ化モジュール6−4は、入力であるヒープダンプ6−2の未処理のレコードがなくなるまで繰り返す(ステップS10−2、S10−8)。
【0120】
グループ化モジュール6−4は、レコードに対する繰り返し処理が開始されると、まず、ヒープダンプ6−2より未処理のレコードを取得する(つまり、
図8に示す“行”を1行ごとに取得する。ステップS10−3)。ここで、取得したレコードを説明の便宜上、“RECORD”と表現する。次にレコードの「種別」を、
図8に示す「種別」から判別する(ステップS10−4)。
【0121】
グループ化モジュール6−4は、レコードの種別がオブジェクトの場合は、そのオブジェクトに関連するクラスローダを特定するために、RECORDの中の「クラスのオブジェクトID」からクラスを特定(ステップS10−5)すると共に、さらに特定されたクラスのレコードに存在する「クラスローダのオブジェクトID」を基に、グループ化テーブル6−7にRECORDを追加登録する(ステップS10−6)。
【0122】
グループ化モジュール6−4は、グループ化テーブル6−7に登録する情報として、「クラスローダのオブジェクトID」列と、「配下のオブジェクトID」列の2つの列に対して、それぞれ以下の値をとる。「クラスローダのオブジェクトID」の値は、前述の手順で取得した「クラスローダのオブジェクトID」の値である。また、「配下のオブジェクトID」の値は、そのRECORDが持つ「オブジェクトID」の値である。
【0123】
次に、グループ化モジュール6−4は、レコードの種別がクラスの場合には、そのRECORDの情報をグループ化テーブル6−7に追加登録する(ステップS10−6)。
【0124】
そして、グループ化モジュール6−4は、グループ化テーブル6−7に登録する情報として、「クラスローダのオブジェクトID」列と、「配下のオブジェクトID」列の2つの列に対してそれぞれ以下の値をとる。「クラスローダのオブジェクトID」の値は、RECORD中の「クラスローダのオブジェクトID」の値である。また、「配下のオブジェクトID」の値は、そのRECORDが持つ「オブジェクトID」の値である。
【0125】
次に、グループ化モジュール6−4は、レコードの種別がクラスローダの場合には、そのRECORDの情報をグループ化テーブル6−7に登録する(ステップS10−7)。
【0126】
そして、グループ化モジュール6−4は、グループ化テーブル6−7に登録する情報として「クラスローダのオブジェクトID」列と、配下のオブジェクトID」列の2つの列に対してそれぞれ以下の値をとる。「クラスローダのオブジェクトID」の値は、RECORD中の「オブジェクトID」の値である。また、「配下のオブジェクトID」の値もそのRECORDが持つ「オブジェクトID」の値である。
【0127】
そして、グループ化モジュール6−4は、レコードの種別がオブジェクトでもクラスでもない、例えばGCルートなどのその他の場合には、何も処理を実施せずに
図11に示すステップS10−8からステップS10−2の間においてヒープダンプテーブル6−8の未処理レコードがなくなるまで繰り返し実施する。
【0128】
グループ化モジュール6−4は、未処理のレコードがなくなると処理が完了し(10−9)、グループ化テーブル6−7すなわち、
図9のグループ化テーブルを出力する。
【0129】
続いてグループ化モジュール6−4は、ヒープダンプ6−2とグループ化テーブル6−7とを入力として参照探索モジュール6−5を呼び出す。
【0130】
ここで、上述したグループ化モジュール6−4の実際の挙動について、
図8に示すヒープダンプテーブル図のデータに基づいて、
図11に示すグループ化モジュールの動作を示すフローチャートを用いてさらに具体的に説明する。
【0131】
まず、グループ化モジュール6−4が動作する前は、出力結果であるグループ化テーブル6−7は、
図13に示す本実施形態に係るグループ化モジュールが動作する前のグループ化テーブル図に示すように空の状態である。
【0132】
グループ化モジュール6−4は、動作を開始すると(ステップS10−1)、入力であるヒープダンプ6−2のレコードに対する繰り返し処理(ステップS10−2、ステップS10−8)を実施する。
【0133】
次に、グループ化モジュール6−4は、ヒープダンプ6−2より、最初の行であるレコードを取得する(ステップS10−3)。レコードはオブジェクトIDがGCR0であるレコードである。グループ化モジュール6−4は、このレコードの種別を判別すると(ステップS10−4)、種別はGCルートであるため、「その他」の分岐を辿り、再度ループを繰り返す(ステップS10−8)。次のオブジェクトIDがGCR1であるレコードも同様である。
【0134】
グループ化モジュール6−4は、ヒープダンプ6−2より、次の行であるレコードを取得する(ステップS10−3)。取得レコードは「オブジェクトID」がCLXであるレコードである。
【0135】
グループ化モジュール6−4は、このレコードの種別を判別すると(ステップS10−4)、種別はクラスローダであるため、グループ化テーブル6−7に登録する情報として、「クラスローダのオブジェクトID」には、このレコードの「オブジェクトID」であるCLXを追加登録すると共に、「配下のオブジェクトID」にもこのレコードの「オブジェクトID」であるCLXを追加登録する(ステップS10−7)。
【0136】
この時点でのグループ化テーブル6−7を
図14に示す。
図14は、本実施形態に係るグループ化モジュール動作の際に、種別がクラスローダの場合のグループ化テーブル図である。
【0137】
グループ化モジュール6−4は、繰り返し処理(ステップS10−2)を実施することにより、ヒープダンプ6−2より次のレコードを取得する(ステップS10−3)。取得レコードは「オブジェクトID」がCX0であるレコードである。
【0138】
グループ化モジュール6−4は、このレコードの種別を判別すると(ステップS10−4)、種別はクラスであるため、グループ化テーブル6−7に登録する情報として、「クラスローダのオブジェクトID」には、このレコードの「クラスローダのID」であるCLXを追加登録すると共に、「配下のオブジェクトID」には、レコードのオブジェクトIDであるCX0を追加登録する(ステップS10−6)。
【0139】
この時点でのグループ化テーブル6−7を
図15に示す。
図15は、本実施形態に係るグループ化モジュール動作の際に、種別がクラスの場合のグループ化テーブル図である。
【0140】
グループ化モジュール6−4は、続く3つのレコードも種別がクラスのレコードであるため、同様の処理を実施する。この時点でのグループ化テーブル6−7を
図16に示す。
【0141】
図16は、本実施形態に係るグループ化モジュール動作の際、種別がその他のクラスの場合のグループ化テーブル図である。
【0142】
グループ化モジュール6−4は、引き続き、繰り返し処理(ステップS10−2)を実施することにより、ヒープダンプ6−2より、次のレコードを取得する(ステップS10−3)。取得レコードは「オブジェクトID」がOX0であるレコードである。
【0143】
グループ化モジュール6−4は、このレコードの種別を判別すると(ステップS10−4)、種別はオブジェクトであるため、クラスローダを特定するためにこのレコードの「クラスのオブジェクトID」の値であるCX0が指し示すレコードを参照する(ステップS10−5)。そのCX0が指し示すレコードの「クラスローダのオブジェクトID」はCLXである。
【0144】
そのため、グループ化テーブル6−7に登録する情報として、「クラスローダのオブジェクトID」には、上記手順で取得したCLXを追加登録すると共に、「配下のオブジェクトID」には、レコードのオブジェクトIDであるOX0を追加登録する(ステップS10−6)。
【0145】
この時点でのグループ化テーブル6−7を
図17に示す。
図17は、本実施形態に係るグループ化モジュール動作の際に、種別がオブジェクトの場合のグループ化テーブル図である。
【0146】
続く3つのレコードも種別がオブジェクトのレコードであるため、同様の処理を実施する。この時点でのグループ化テーブル6−7を
図18に示す。
図18は本実施形態に係るグループ化モジュール動作の際に、種別がその他のオブジェクトの場合のグループ化テーブル図である。
【0147】
以降のレコードにも同様の繰り返し処理を実施すると、最終的に
図9に示すグループ化テーブルとなり、処理を終了する(ステップS10−9)。
【0148】
次に、
図7に示す、本実施形態に係るデータ参照元特定システムの機能を概念的に示すブロック図における参照探索モジュール6−5の動作について、
図12を用いて詳細に説明する。
図12は、本実施形態に係る参照探索モジュールの動作を示すフローチャートである。これを用いて破棄済みクラスローダを基準にしてグループ化したクラスやオブジェクトを含むオブジェクト群をそのグループの外部から参照するその参照元を探索する。
【0149】
参照探索モジュール6−5の動作は、開始より始まる(ステップS11−1)。参照探索
モジュール6−5は、入力であるヒープダンプ6−2の未処理の行がなくなるまで処理を繰り返す(ステップS11−2、ステップS11−12)。
【0150】
参照探索モジュール6−5は、ヒープダンプ6−2のレコードに対する繰り返し処理を開始すると、まずヒープダンプ6−2より未処理のヒープダンプのレコードを取得する(ステップS11−3)。
【0151】
ここで、取得したヒープダンプのレコードを説明の便宜上、RECORDと表現する。
【0152】
続いて、参照探索モジュール6−5は、入力であるグループ化テーブル6−7の未処理のレコードがなくなるまで処理を繰り返す(ステップS11−4、ステップS11−11)。
【0153】
参照探索モジュール6−5は、グループ化テーブル6−7のレコードに対する繰り返し処理を開始すると、まずグループ化テーブル6−7より未処理のレコードを取得する(ステップS11−5)。ここで、取得したグループ化テーブル6−7のレコードを説明の便宜上、GROUPED_RECORDと表現する。
【0154】
そして、参照探索モジュール6−5は、次の条件式Aに示す、3つの条件を全て満たすか否かを確認する(ステップS11_6)。すなわち、
条件1は、GROUPED_RECORDの「クラスローダのオブジェクトID」で示されるクラスローダが破棄済みである。
【0155】
条件2は、RECORDの「オブジェクトID」がGROUPED_RECORDの「配下のオブジェクトID」のどれとも一致しない。そして、
条件3は、RECORDの「参照先のオブジェクトID」とGROUPED_RECORDの「配下のオブジェクトID」とが一致する。
である。
【0156】
ここで「参照先のオブジェクトID」は、
図8に示すヒープダンプテーブルのRECORDであり、「クラスローダのオブジェクトID」と「配下のオブジェクトID」は、
図9に示すグループ化テーブルのGROUPED_RECORDである。
【0157】
そして参照探索モジュール6−5は、条件式Aに示す上記条件が全て満たされた場合(YES:ステップS11_6)、グループ外からの参照テーブル6−8に、以下の通りの行を追加登録する(ステップS11_7)。すなわち、
(1)「クラスローダのオブジェクトID」の列の値は、GROUPED_RECORDの「クラスローダのオブジェクトID 」の値とする。
(2)「参照元のオブジェクトID」の列の値は、RECORDの「オブジェクトID」の値とする。
【0158】
ただし、RECORDの「参照先のオブジェクトID」に複数の参照先が含まれている場合には、上記の(2)については、上述した条件3を満たす参照のみを書きこむ。
(3)「参照先のオブジェクトID」の列の値は、RECORDの「参照先のオブジェクトID」の値とする。
【0159】
参照探索モジュール6−5は、条件式Aに示す上記条件の何れかが満たされない場合(NO:ステップS11_6)、繰り返し処理(ステップ11−11)を実施する。
【0160】
そして、
図7に示す、データ参照元特定システムの機能を概念的に示すブロック図における参照探索モジュール6−5は、ステップS11−2とステップS11−4の繰り返しを終了すると処理を終了し、グループ外からの参照テーブル6−8を出力する(ステップS11_12、ステップS11−13)。
【0161】
なお、グループ外からの参照テーブルの一例は
図10であり、
図6に示す、破棄済みクラスローダへのグループ外から参照する例を説明する図における5−3、5−4、5−6、5−10、5−12、5−14の参照を示している。
【0162】
そして、
図7に示すブロック図における参照探索モジュール6−5は、グループ外からの参照テーブル6−8を入力として、出力装置を呼び出す。
【0163】
上述したように、本実施形態に係るデータ参照元特定システムでは、破棄済みクラスローダ探索モジュール6−3と、グループ化モジュール6−4と、参照探索モジュール6−5とを用いることにより、グループ外からの参照テーブル6−8を得ることが出来る。
【0164】
それによって、参照先のオブジェクトのサイズや、そのオブジェクトの個数に依らずに、クラスローダを基準としてグループ化したオブジェクトのうちの破棄済みクラスローダのグループをそのグループ外から参照するその参照元のオブジェクトを特定することができる。
【0165】
すなわち本実施形態によれば、参照元のオブジェクトを直接的に特定することができるので、参照先のオブジェクトのサイズが小さいか、もしくは個数が少ない場合でもメモリリークの直接の原因となる参照元のオブジェクトを特定することができるという効果を奏することができる。
【0166】
また、本実施形態によれば、参照先のオブジェクトのサイズが小さいか、もしくは個数が少ない場合でもメモリリークの直接の原因となる参照元のオブジェクトを効率的に特定することができるので、例えば開発や評価途上での長時間動作試験などを実施しなくてもメモリリークを容易に検出することができるという効果を奏することができる。
【0167】
さらに、本実施形態によれば、APにおける複数の時点でのヒープダンプを比較してクラスやオブジェクトの増減を観察する必要がなく、ある時点での単一のヒープダンプを用いるだけでメモリリークの参照元のオブジェクトを特定することができるという効果を奏することができる。
【0168】
つまり、本実施形態によれば、参照先のオブジェクトのサイズが小さいかもしくはオブジェクトの個数が少ない場合でもメモリリークの直接の原因となる参照元のオブジェクトを特定することができるという効果を奏することができる。
【0169】
以上、本発明の第2の実施形態として、上述した構成および動作を例に説明したが、本発明は、必ずしも係る構成や動作には限定されない。
【0170】
<第3の実施形態>
次に、第1および第2の実施形態を基本とする、応用例である第3の実施形態について
図6および
図7を参照して説明する。
【0171】
第3の実施形態は、
図7に示す第2の実施形態に係るデータ参照元特定システムの機能を概念的に示すブロック図における破棄済みクラスローダ探索モジュール6−3に対して、破棄済みとマーキングしたクラスローダにのみ依存(すなわち、参照)するクラスローダに対して、そのクラスローダが明示的に破棄済みとマーキングされていなくても破棄済みと見なすように処理を変更した点が、第2の実施形態と異なる。そのため説明の便宜上、このクラスローダを見なし破棄済みクラスローダと呼ぶこととする。
【0172】
そして、以下の説明において、第2の実施形態で説明した
図6乃至
図18と同じ動作をする箇所は説明を省略すると共に、本実施形態における上述した相違点を中心に、構成と動作および効果を説明する。
【0173】
第2の実施形態に係るデータ参照元特定システムでは、参照探索モジュール6−5は、見なし破棄済みクラスローダのグループへの参照がリーク(すなわち、明示的に破棄済みとはマーキングしてはいないが引き続き参照される)している場合、そのリークの原因となる外部からの参照は、見なし破棄済みクラスローダのグループから破棄済みクラスローダのグループへの参照として現れることとなる。
【0174】
例えば、
図6に示す、破棄済みクラスローダCLXへのグループ外からの参照を示す図において、CLV(不図示)という、見なし破棄済みクラスローダのグループのオブジェクトOV(不図示)から、OX4への参照があった場合を考える。
【0175】
参照探索モジュール6−5は、CLVは見なし破棄済みクラスローダであるので、そのCLVのクラスローダを基準にしてグループ化したオブジェクト群のうちのオブジェクトOVを参照する別のグループのクラスローダであるCLW(不図示)のオブジェクト群があったとした場合、そのオブジェクト群は、実質的にOX4を参照しているので、リークの元であることが判る。
【0176】
上述したように、本実施形態に係るデータ参照元特定システムにおいては、リークの原因となる外部からの参照は、見なし破棄済みクラスローダのグループへの参照として現れるため、メモリリークの原因となる参照元の特定をより正確に行うことが可能となる。
【0177】
すなわち本実施形態によれば、参照元のオブジェクトを直接的に特定することができるので、参照先のオブジェクトのサイズが小さいか、もしくは個数が少ない場合でもメモリリークの原因となる参照元のオブジェクトを特定することができるという効果を奏することができる。
【0178】
また、本実施形態によれば、参照先のオブジェクトのサイズが小さいか、もしくは個数が少ない場合でもメモリリークの原因となる参照元のオブジェクトを効率的に特定することができるので、例えば開発や評価途上での長時間動作試験などを実施しなくてもメモリリークを容易に検出することができるという効果を奏することができる。
【0179】
さらに、本実施形態によれば、APにおける複数の時点でのヒープダンプを比較してクラスやオブジェクトの増減を観察する必要がなく、ある時点での単一のヒープダンプを用いるだけでメモリリークの参照元のオブジェクトを特定することができるという効果を奏することができる。
【0180】
加えて、破棄済みクラスローダにのみ依存するクラスローダが破棄済みと明示していなくても破棄済みと見なすことにより、メモリリークの原因となるグループ外から参照する参照元を正確に特定することが可能になるという追加の効果を奏することができる。
【0181】
つまり、本実施形態によれば、参照先のオブジェクトのサイズが小さいかもしくはオブジェクトの個数が少ない場合でもメモリリークの原因となる参照元のオブジェクトを特定することができるという効果を奏することができる。
【0182】
以上、本発明の第3の実施形態として、上述した構成および動作を例に説明したが、本発明は、必ずしも係る構成や動作には限定されない。
【0183】
<第4の実施形態>
次に、第2および第3の実施形態を基本とする、第4の実施形態について
図19を用いて説明する。
図19は、第4の実施形態に係るデータの参照元を特定するコンピュータ・プログラムを説明する図である。
【0184】
本実施形態は、情報処理装置100において、
図7に示す第2の実施形態に係るデータ参照元特定システムの機能を概念的に示すブロック図における各機能を、情報処理装置100が有するCentral Processing Unit(以下、「CPU」と略称する)101と、そのCPU101において動作するソフトウェアであるOperating System(以下、「OS」と略称する)ならびにコンピュータ・プログラムであるアプリケーションソフト(以下、「アプリ」と略称する)とが協働することにより制御する。
【0185】
そのため、以下の説明において、第2および第3の実施形態で説明した、
図6乃至
図18に示す各ブロック図と、各フローチャート図および、各テーブルにおいて同じ構成や、同じ動作をする箇所は、説明を省略すると共に、本実施形態における上述した相違点を中心に、構成と動作および効果を説明する。
【0186】
図19に示す情報処理装置100は、CPU101と、CPU101において動作するOSならびにアプリと、メモリ102と、読書き可能な不揮発性記憶媒体であるストレージ108と、コンピュータ・プログラムや各種のテーブルなどのデータやファイルを記録する記録媒体109と、KBならびにマウスなどの入力デバイス111、モニタに表示をする出力デバイス110とからなる。
【0187】
また、本情報処理装置100の図示していない外部装置と通信するための通信インタフェース112および、外部装置との間でデータ転送を行うための高速データバス113とを有している。ここで、通信インタフェース112は、例えば有線や無線などの企業のイントラネットや、一般公共のインターネットなどの今では一般的な通信インタフェースを用いることができる。また、高速データバス113は、外部装置との間でデータ通信が可能なバスであればよい。
【0188】
なお、
図19に記載している例えば、チップセットや入出力コントローラは、CPU101やメモリ102と共に情報処理装置100を構成するデバイスであり、CPU101と協働するOSやアプリによってストレージ108と、記憶媒体109と、入力デバイス111と、出力デバイス110と、通信インタフェース112および高速データバス113などの周辺機能デバイスを制御するための集積回路である。
【0189】
また、メモリ102には、アプリの一部である本来の処理を行うプログラム105と、例えばJava_VMが動作する際に生成する情報を格納するヒープ領域103(すなわち、
図1に示す、参照情報群3や、
図2に示す参照情報群24に対応)と、参照元特定プログラム104(すなわち、
図7に示す、第2の実施形態に係るデータ参照元特定システムの機能を概念的に示すブロック図の各処理に対応)と、グループ化テーブル106(すなわち、
図7に示すグループ化テーブル6−7)と、グループ外からの参照テーブル107(すなわち、
図7に示すグループ外からの参照テーブル6−8に対応)とを有している。
【0190】
ここで、プログラム105は、本情報処理装置100が、本来処理するプログラムであり、参照元特定プログラム104は、本実施形態で説明する本来処理するプログラム105におけるメモリリークの直接の原因となる参照元を特定するコンピュータ・プログラムである。
【0191】
そして本情報処理装置100を、通信インタフェース112もしくは、高速データバス113を用いて図示していない外部装置から自動もしくは、入力デバイス111を用いて手動によって起動すると、ストレージ108からメモリ102にアプリの一部であるプログラム105および、参照元特定プログラム104とが読み込まれる。
【0192】
なお、初期には、アプリおよびアプリの一部であるプログラム105や参照元特定プログラム104は、自動もしくは手動によって記憶媒体109か、通信インタフェース112もしくは高速データバス113を経て本情報処理装置100のストレージ108に格納することが可能である。
【0193】
そして、メモリ102における、参照元特定プログラム104は、破棄済みクラスローダ特定部116と、グループ化部117と、参照元特定部118と、入出力処理部119とを有する。また、入出力処理部119は例えば、外部装置やデータやファイルを操作する高速データバス113や記録媒体109のほか、入力デバイス111や出力デバイス110なども制御する。
【0194】
つまり、本情報処理装置100によるデータ参照元特定システムを実現するために、上述した
図7乃至
図18に示す各機能ブロックの動作説明図と、各テーブルと、各モジュール機能のフローチャートの動作とを、実現可能なアプリつまりコンピュータ・プログラムとして供給する。
【0195】
そして、そのコンピュータ・プログラムを本情報処理装置100によるデータ参照元の特定方法として用意した上記CPU101および協働するOSならびにアプリの一部であるプログラム105と参照元特定プログラム104とをメモリ102に読み出して実行することによって達成する。
【0196】
なお、本実施形態における破棄済みクラスローダ特定部116と、グループ化部117と、参照元特定部118とは、第2および第3の実施形態における破棄済みクラスローダ探索モジュール6−3と、グループ化モジュール6−4と、参照探索モジュール6−5にそれぞれ対応する。
【0197】
そのため、具体的な動作については、第2の実施形態および、第3の実施形態において
図6乃至
図18を用いて説明しているので本実施形態での説明は省略する。
【0198】
上述したように、例えばサーバや、ワークステーション(Work Station;以下「WS」と略称する)などの汎用の情報処理装置100を用いて、メモリ102に参照元特定プログラム104を読込むと共に、本来実行するプログラムと共にその処理を実行するにより、本来実行するプログラムにおけるメモリリークの直接の原因となるデータの参照元を特定することができる。
【0199】
また、本情報処理装置100は、情報処理装置と記載したが、通信インタフェース112や、高速データバス113を介して、例えば企業のイントラネットやインターネットに接続する外部装置である他の情報処理装置と接続することにより、それらの情報処理装置に対してアプリケーションサービスを提供することが可能な情報処理システムとも見なすことができる。
【0200】
なお、本実施形態における情報処理装置100は、説明の都合上、
図2に示すようなJava_VM環境におけるJavaプログラムによるAPサーバの動作を基に説明したが、
図2に示すように、OSの種類には限定されない。
【0201】
また、本実施形態における情報処理装置100は、Java_VM環境に限定せずに、何れかのOSと協働する何れかのJava_VM環境のようなミドルウェアを用いて実現してもかまわない。
【0202】
また、本実施形態で説明したメモリリークの直接の原因となる参照元を特定するコンピュータ・プログラムである参照元特定プログラム104は、上述したようなJava_VM環境や同様のミドルウェアが有するプログラムもしくは、本来動作するプログラム105に含まれるように構成してもよい。
【0203】
すなわち本実施形態によれば、参照元のオブジェクトを直接的に特定することができるので、参照先のオブジェクトのサイズが小さいか、もしくは個数が少ない場合でもメモリリークの直接の原因となる参照元のオブジェクトを特定することができるという効果を奏することができる。
【0204】
また、本実施形態によれば、参照先のオブジェクトのサイズが小さいか、もしくは個数が少ない場合でもメモリリークの直接の原因となる参照元のオブジェクトを効率的に特定することができるので、例えば開発や評価途上での長時間動作試験などを実施しなくてもメモリリークを容易に検出することができるという効果を奏することができる。
【0205】
さらに、本実施形態によれば、APにおける複数の時点でのヒープダンプを比較してクラスやオブジェクトの増減を観察する必要がなく、ある時点での単一のヒープダンプを用いるだけでメモリリークの参照元のオブジェクトを特定することができるという効果を奏することができる。
【0206】
加えて、例えばサーバやWSなどの汎用の情報処理装置を用いて、そこに上述した参照元を特定するコンピュータ・プログラムを読込むと共にその処理を実行するにより、メモリリークの直接の原因となる参照元を容易に特定することができるので、信頼性の高いAPサービスを提供することができるという効果を奏することができる。
【0207】
つまり、本実施形態によれば、参照先のオブジェクトのサイズが小さいかもしくはオブジェクトの個数が少ない場合でもメモリリークの直接の原因となる参照元のオブジェクトを特定することができるという効果を奏することができる。
【0208】
以上、本発明の第4の実施形態として、上述した構成および動作を例に説明したが、本発明は、必ずしも係る構成や動作には限定されない。
【0209】
なお、上述した実施形態及びその変形例の一部又は全部は、以下の付記のようにも記載されうる。しかしながら、上述した実施形態及びその変形例により例示的に説明した本発明は、以下には限らない。即ち、
(付記1)
アプリケーションの配備に伴って元プログラム読み込み機能を生成すると共に該元プログラム読み込み機能を用いて前記アプリケーションを構成するオブジェクト群であるプログラムおよびその元プログラムとが記憶領域に生成して実行される情報処理装置において、アプリケーションの実行に伴って更新される、記憶領域における前記オブジェクト群の参照関係を表す参照情報群に含まれるデータに基づいて、前記オブジェクト群を前記元プログラム読み込み機能を基準にしてグループ化するグループ化部と、
前記アプリケーションの終了に伴って破棄済みとマーキングされた破棄済みの元プログラム読み込み機能を基準にして、前記グループ化された情報に基づいてグループ化したグループに対して、該グループの外部から参照する参照元を特定する参照元特定部とを有すること特徴とするデータ参照元特定システム。
(付記2)
前記グループ化部は、前記参照情報群の更新データに基づいて、前記プログラムおよび前記元プログラムとを、前記元プログラムを読み込んだ前記元プログラム読み込み機能を基準にしてグループ分けすると共に、グループ分けの状態を表すグループ化情報を保持することを特徴とする付記1に記載のデータ参照元特定システム。
(付記3)
前記参照元特定部は、前記参照情報群の更新データおよび前記グループ化部における前記元プログラム読み込み機能を基準にしてグループ分けした際のグループ化情報に基づいて、前記グループ化された破棄済みの元プログラム読み込み機能のグループに対して該グループの外部から参照する参照元を特定することを特徴とする付記1もしくは付記2に記載のデータ参照元特定システム。
(付記4)
前記グループ化部は、前記破棄済みの元プログラム読み込み機能である破棄済みのクラスローダを、前記参照情報群を参照することにより特定する破棄済みクラスローダ探索モジュールと、
前記参照情報群であるヒープダンプテーブルと、前記特定された破棄済みのクラスローダの一覧とを基にグループ分けすると共に、グループ化情報であるグループ化テーブルを生成するグループ化モジュールとを含むことを特徴とする付記1もしくは付記2に記載のデータ参照元特定システム。
(付記5)
前記グループ化モジュールは、前記ヒープダンプテーブルおよび前記破棄済みクラスローダの一覧に基づいて、ヒープダンプテーブルに含まれるレコードの種別が前記オブジェクトの場合には、該オブジェクトが属する前記クラスのオブジェクトIDを基にクラスのレコードを特定すると共に、特定したクラスローダのオブジェクトIDを基にグループ化テーブルにレコードを追加登録し、前記種別が前記クラスの場合には、その特定したクラスローダのオブジェクトIDを基にグループ化テーブルにレコードを追加登録し、前記種別が前記クラスローダの場合には、前記オブジェクトIDを基にグループ化テーブルにレコードの情報を追加登録し、前記種別がメモリ資源を解放するメモリ資源解放機能であるガベージコレクションを含むその他の場合には、何も処理をしないグループ分けを行うと共にグループ化テーブルを生成することを特徴とする付記4に記載のデータ参照元特定システム。
(付記6)
前記参照探索モジュールは、前記ヒープダンプテーブルおよび前記グループ化テーブルに基づいて、該グループ化テーブルのレコードに対して、グループドレコードの「クラスローダのオブジェクトID」で示される前記クラスローダが破棄済みでかつ、レコードの「オブジェクトID」が前記グループドレコードの「配下のオブジェクトID」の何れにも一致しないでかつ、前記レコードの「参照先のオブジェクトID」と前記グループドレコードの「配下のオブジェクトID」が一致する条件を満たした場合に、グループ外からの参照テーブルに対して、「クラスローダのオブジェクトID」の列には、前記グループドレコードの「クラスローダのオブジェクトID」の値を、「参照元のオブジェクトID」の列には、前記レコードの「オブジェクトID」の値を、そして「参照先のオブジェクトID」の列には、前記レコードの「参照先のオブジェクトID」の値をそれぞれ追加登録することにより、グループ外からの参照テーブルを生成すると共に、グループ外から参照する参照元を探索することを特徴とする付記4に記載のデータ参照元特定システム。
(付記7)
前記データ参照元特定システムは、前記破棄済みとマーキングされたクラスローダのオブジェクト群が占有するメモリ資源を解放するガベージコレクションの参照開始点からの参照をも参照元としてグループ分けすることにより、その参照元を特定することを特徴とする付記5に記載のデータ参照元特定システム。
(付記8)
前記グループ化モジュールは、明示的に破棄済みとマーキングされていなくとも前記破棄済みのクラスローダにのみ依存するクラスローダを前記破棄済みのクラスローダと見なしてグループ分けするとともに、前記グループ化テーブルを生成することを特徴とする付記1、付記2、付記4、もしくは付記5の何れかに記載のデータ参照元特定システム。
(付記9)
前記ヒープダンプテーブルに含まれる情報には、ガベージコレクションの参照開始点からの参照および暗黙の参照とを含むことを特徴とする付記4乃至付記8に記載のデータ参照元特定システム。
(付記10)
アプリケーションの配備に伴って元プログラム読み込み機能を生成すると共に該元プログラム読み込み機能を用いて前記アプリケーションを構成するオブジェクト群であるプログラムおよびその元プログラムとが記憶領域に生成して実行される情報処理装置において、
アプリケーションの実行に伴って更新される、記憶領域におけるオブジェクト群の参照関係を表す参照情報群に含まれるデータに基づいて、前記オブジェクト群を前記元プログラム読み込み機能を基準にしてグループ化し、
前記アプリケーションの終了に伴って破棄済みとマーキングされた破棄済みの元プログラム読み込み機能を基準にして、前記グループ化された情報に基づいてグループ化したグループに対して、該グループの外部から参照する参照元を特定する
ことを特徴とするデータ参照元特定方法。
(付記11)
アプリケーションの配備に伴って元プログラム読み込み機能を生成すると共に該元プログラム読み込み機能を用いて前記アプリケーションを構成するオブジェクト群であるプログラムおよびその元プログラムとが記憶領域に生成して実行される情報処理装置を制御するコンピュータ・プログラムであって、そのコンピュータ・プログラムにより、
アプリケーションの実行に伴って更新される、記憶領域における前記オブジェクト群の参照関係を表す参照情報群に含まれるデータに基づいて、前記オブジェクト群を前記元プログラム読み込み機能を基準にしてグループ化するグループ化機能と、
前記アプリケーションの終了に伴って破棄済みとマーキングされた破棄済みの元プログラム読み込み機能を基準にして前記グループ化された情報に基づいてグループ化したグループに対して、該グループの外部から参照する参照元を特定する機能とを、
コンピュータに実現させることを特徴とするコンピュータ・プログラム。