(57)【要約】【課題】  プログラム実行環境において、メモリリークの検出および原因究明のために取得されるヒープダンプのファイルサイズを削減する。大規模システムにおいても利用可能なメモリリーク調査手段を提供する。【解決手段】  ヒープダンプを取得する際、ヒープメモリ内のオブジェクトのうち、次の条件に適合するものだけを出力する。（１）指定期間内に新規生成されたオブジェクトで、生存しているもの。（２）ルートセットから（１）のオブジェクトへ至る参照パス上にあるオブジェクト。【選択図】  図６
2006350876.tif 000002
【特許請求の範囲】
【請求項１】
ルートセットから参照の連鎖上にないオブジェクトを、自動的に解放する機能を備えるプログラム実行環境において、
新規生成フラグ、生存フラグ、ダンプ対象フラグを有するオブジェクトがヒープメモリに格納されてゆく第１のステップと、
始点設定要求を受信する第２のステップと、
ヒープメモリに格納された全てのオブジェクトの新規生成フラグをクリアする第３のステップと、
予め指定された期間を経て、終点設定要求を受信する第４のステップと、
ヒープメモリに格納された全てのオブジェクトの生存フラグとダンプ対象フラグを設定する第５のステップと、
第５のステップで設定されたダンプ対象フラグに基づいて、ダンプ出力を行う第６のステップと、
第６のステップで、前記生存フラグに基づいて生存しているオブジェクトのうち、ルートセットから参照の連鎖上にあるオブジェクトのみを表示する第７のステップと、
を有するヒープダンプ取得方法。
【請求項２】
請求項１記載のヒープダンプ取得方法において、
前記ルートセットから参照の連鎖上にないオブジェクトを、自動的に解放する機能は、ガーベジコレクション機能であるヒープダンプ取得方法。
【請求項３】
請求項１記載のヒープダンプ取得方法において、
前記生存フラグは、ルートセットから参照の連鎖上にあるとき生存を意味し、そうでない場合に無効を意味する設定が為されるヒープダンプ取得方法。
【請求項４】
請求項１記載のヒープダンプ取得方法において、
前記ダンプ対象フラグは、（１）オブジェクトの前記新規生成フラグが新規生成を、かつ、前記生存フラグが生存をそれぞれ意味しているとき、または（２）オブジェクトがルートセットから（１）の条件に該当するオブジェクトへの参照の連鎖上にあるとき、のいずれかの場合において、対象であることを意味し、そうでない場合に対象でないことを意味するヒープダンプ取得方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、信頼性の高いプログラム実行環境を整える、デバッグ支援方法に係り、特に、メモリリークの検出・特定に有用な、ヒープダンプの取得方法に関する。
【背景技術】
【０００２】
プログラム実行環境は、実行中のプログラムからの要求に応じてメモリ領域を動的に割り当てるメモリ管理機構（ヒープメモリ）を備えることが普通である。プログラムは割り当てられたメモリ領域にオブジェクトを格納して処理を行い、オブジェクトを保持する必要がなくなった時点でそのメモリ領域を返却する（オブジェクトの解放）。
あるオブジェクトが他のオブジェクトのＩＤをデータとして持つことを「参照する」と言い、プログラミングの手法として一般的に用いられている。オブジェクトを解放するには、（１）そのオブジェクトへの参照をなくす、（２）そのメモリ領域を解放する、という２つの処理を行う。プログラム実行環境によっては、プログラムは（１）を行うだけでよく、（２）はプログラム実行環境により自動的に行われるものもある。この機能を一般にガーベジコレクション（Ｇａｒｂａｇｅ Ｃｏｌｌｅｃｔｉｏｎ）という。
プログラムの処理を進める上で不必要なオブジェクトが解放されずに残る現象をメモリリークと言う。メモリリークが発生すると、プログラムが利用できるメモリ領域が減少し、性能低下や処理不能の状態に陥る場合がある。メモリリークの原因はプログラムのミスである。メモリリークの対策を行うには、どのオブジェクトが解放されずに残っているのか、どのような参照があるためにオブジェクトが解放されないのか、を特定する必要がある。
【０００３】
一般に、メモリリークの原因となっているオブジェクトを特定するには、次の手順による調査が行われる。（１）どのような操作を行った場合にメモリリークが発生するのか（メモリリーク再現手順）を特定する。（２）特定したメモリリーク再現手順を行う前後でヒープダンプを取得する。（３）取得した２つのヒープダンプの差分を取る。これにより、メモリリーク再現手順を行うことで新規に生成され、解放されずに残っているオブジェクトが特定される。これらのオブジェクトはメモリリークの原因となっている疑いが強い。
メモリリークの原因となっているオブジェクトを特定したら、取得したヒープダンプに基づいてオブジェクトの参照関係を調べ、それらのオブジェクトが解放されない原因を特定する。
【０００４】
【特許文献１】特開平１１−３１２０９７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
このような従来の方法においては次のような問題がある。すなわち、企業の業務処理を行うサーバプログラム等の大規模なシステムを対象としてヒープダンプを取得した場合、出力ファイルのサイズが巨大なものとなり、記憶装置の容量を圧迫する。また、ダンプ出力処理に長時間を要する。このため、調査が不可能または著しく困難である。
従来のヒープダンプ取得方法では、出力ファイルのサイズはヒープメモリの使用量におおよそ比例する。さらに、ある期間に新規生成されたオブジェクトを特定するためには、ヒープダンプを複数回、取得する必要があった。
【課題を解決するための手段】
【０００６】
ヒープダンプを取得する際、ヒープメモリ内のオブジェクトのうち、次の条件に適合するものだけを出力する。（１）指定期間内に新規生成されたオブジェクトで、生存しているもの。（２）ルートセットから（１）のオブジェクトへ至る参照の連鎖（参照パス）上にあるオブジェクト。
【０００７】
ここで、ルートセットとは、プログラム実行環境から直接参照される基本的なオブジェクトをいう。
【発明の効果】
【０００８】
ヒープダンプを一度取得するだけで指定期間に新規生成されたオブジェクトを特定でき、それらのオブジェクトが解放されない原因も調査可能である。また、ダンプ出力されるオブジェクトの数が削減される。すなわち、ヒープダンプの有用性を損なわずに、出力ファイルのサイズを大幅に縮小する。これにより、記憶装置の使用量およびダンプ出力処理時間を低減できる。
【発明を実施するための最良の形態】
【０００９】
本発明のヒープダンプ取得方法を、プログラム実行環境に組み込まれたヒープダンプ取得機能の形で実現した。このプログラム実行環境は、ルートセットから到達可能でないオブジェクトを自動的に解放する機能（Ｇａｒｂａｇｅ  Ｃｏｌｌｅｃｔｉｏｎ機能）を備えるものとする。
【実施例１】
【００１０】
図１は、本発明の一実施例であるプログラム実行環境の全体構成を示すブロック図である。
プログラム実行部１０はプログラム７０を実行する。ヒープメモリ管理部２０は、ヒープメモリ３０内のメモリ領域の割り当ておよび解放と、ヒープメモリ３０の内容をファイル格納部４０へダンプ出力する処理を行う。プログラム実行部１０は操作入力部５０からユーザの操作入力を受け取り、画面表示部６０へ情報の表示を行う。
【００１１】
図２は、プログラム実行環境においてヒープダンプ取得が行われる際の動作を示すフローチャートである。
【００１２】
図３は、ヒープメモリ３０の構造図である。ヒープメモリ３０内にオブジェクト３００が格納される。同図では２つのオブジェクト３００（ＩＤはそれぞれ４０００と５０００）が存在している。オブジェクト３００は管理情報であるオブジェクトヘッダ３１０と、データ本体であるオブジェクトデータ３２０から成る。ＩＤが４０００のオブジェクト３００は、データとして値が１２３４である数値と、ＩＤが５０００であるオブジェクトへの参照を持っている。ルートセット管理表２００は、プログラム実行環境から直接参照される基本的なオブジェクト３００（ルートセット）を管理する表である。図３では、ＩＤが５０００のオブジェクト３００が、ルートセットとなっている。
【００１３】
図４は、オブジェクトヘッダ３１０の構造を示す図である。オブジェクトヘッダ３１０は、新規生成フラグ３１１、生存フラグ３１２、ダンプ対象フラグ３１３を持つ。各フラグは１ビットで、値として０または１をとる。新規生成フラグ３１１は、オブジェクト３００が新規生成された際に１（新規生成）が設定され、クリア処理が行われると０（新規生成でない）が設定される。
【００１４】
次に図２のフローチャートに基づいて図１の各部の動作を説明する。
まず、プログラム実行環境においてプログラム７０の実行が開始される。プログラム実行部１０は、ユーザが予め投入した、始点設定要求を受信すると（ステップ１００）、プログラムの実行を中断し、ヒープメモリ管理部２０の始点設定機能（ステップ１０１）を呼出す。
ステップ１０１において、ヒープメモリ管理部２０は、ヒープメモリ３０内に格納されているすべてのオブジェクト３００（図３）の新規生成フラグ３１１（図４）をクリア（０：新規生成でないことを示す値を設定）する。この時点でのヒープメモリ３０の状態の一例を図５に示す。図５は図３の表記を略し、オブジェクト３００を丸で囲むＡ、Ｂ等で示したものである。
ここでは、４つのオブジェクトＡ、Ｂ、Ｃ、Ｄが存在し、ＡはＢを参照、ＣはＢおよびＤを参照していることを示す。また、Ａはルートセットに含まれるオブジェクトとなっている。各オブジェクトの付近にある「Ｆ：０？？」という記号は、オブジェクトヘッダ３１０の３つのフラグの状態を表すもので、各桁がそれぞれ左から新規生成フラグ３１１、生存フラグ３１２、ダンプ対象フラグ３１３に対応する。ここでは、新規生成フラグ３１１がクリアされたため「０」、その他２つのフラグは未設定のため「？」（不定：０または１）となっていることを示す。以上のフラグ設定処理が完了したら、プログラム実行部１０はプログラムの実行を再開させる。
【００１５】
プログラム実行部１０は、ユーザが予め投入した、ヒープダンプ要求（終点設定要求）を受信すると（図２、ステップ１０２）、プログラムの実行を中断し、ヒープメモリ管理部２０のヒープダンプ機能を呼出す。
ステップ１０３において、ヒープメモリ管理部２０（図１）は、ヒープメモリ３０内に格納されている全オブジェクト３００（図３）を調査し、生存フラグ３１２およびダンプ対象フラグ３１３を設定する。生存フラグ３１２は、オブジェクト３００が、ルートセットからの参照をたどって到達可能である場合に１（生存）、そうでない場合に０（非生存）が設定される。ダンプ対象フラグ３１３は、（１）オブジェクト３００の新規生成フラグ３１１および生存フラグ３１２が共に１であるとき、または、（２）オブジェクト３００がルートセットから（１）の条件に適合するオブジェクト３００への参照の連鎖上に存在するとき、のいずれかの場合に１（対象）、そうでない場合に０（非対象）が設定される。この時点のヒープメモリ３０の一状態例を図６に示す。上記２つの条件（１）（２）のうち、どちらかに適合するオブジェクトがダンプ対象となっている。例えば、Ｆは（１）に適合し、ＡとＢは（２）に適合することからダンプ対象となる。Ｃ、Ｄ、Ｅは（１）（２）のどちらにも適合しないため、ダンプ対象になっていない。
図５の状態と比べ、新しく２つのオブジェクトＥ、Ｆが追加されており、ＣはＥを参照、ＢはＦを参照、ＦはＤを参照している。ここで、各オブジェクトのフラグの値について説明する。新しく追加されたＥおよびＦは新規生成フラグ３１１が１となっている。Ａ、Ｂ、Ｄ、Ｆはルートセットから到達可能であるため、生存フラグ３１１に１が設定されている（到達可能でないＣとＥは０）。Ｆは新規生成フラグ３１１および生存フラグ３１２が共に１であるため、ダンプ対象フラグ３１３に１が設定されている。ＡとＢはルートセットからＦへ至る参照パス上にあるため、ダンプ対象フラグ３１３に１が設定されている。Ｃ、Ｄ、Ｅは上記２つの条件のどちらにも当てはまらないため、ダンプ対象フラグ３１３に０が設定されている。
【００１６】
以上のステップによりヒープダンプの出力に必要なフラグ設定作業（ステップ１０３）が完了した。ステップ１０４において、ヒープメモリ管理部２０は、ヒープメモリ３０内のオブジェクト３００のうち、ダンプ対象フラグ３１３が１であるもの選択し、ファイル格納部４０へダンプ出力を行う。ダンプ出力されるオブジェクト３００がルートセットに含まれるものである場合や、新規生成フラグ３１１が設定されたものである場合は、それらのことを示す情報も出力しておく。以上により、一連のヒープダンプ出力処理が完了する。
【００１７】
図７は、本実施例のヒープダンプ取得機能により出力されたファイルを解析する際に用いるアプリケーションの画面例である。これによりユーザは、Ｆが指定期間に新規生成され生存しているオブジェクトである（すなわちメモリリーク原因である疑いが強い）こと、Ｆがプログラム実行環境によって解放されないのはルートセットからＡ、Ｂを経由してＦに至る参照があるためであること、というメモリリークの調査において重要な情報を直ちに得ることができる。なお、以上で述べた実施例においては、ヒープダンプの差分を求める期間の始点および終点を、予めユーザから入力によって決定していたが、その他の条件をトリガとすることも可能である。例えば、プログラムの開始、終了、特定のコードの実行前、実行後、ヒープメモリ使用量が閾値に達した場合などの、プログラムの実行状況に関連する条件を利用することが考えられる。
【産業上の利用可能性】
【００１８】
ヒープダンプの取得に必要となるコスト（記憶装置の容量およびダンプ出力時間）を低減でき、大規模システムを対象としたメモリ関連障害の調査に有効に利用できる。
【図面の簡単な説明】
【００１９】
【図１】本発明の一実施例であるプログラム実行環境の全体構成を示すブロック図である。
【図２】プログラム実行環境においてヒープダンプ取得が行われる際の動作を示すフローチャートである。
【図３】ヒープメモリ３０の構造図である。
【図４】オブジェクトヘッダ３１０の構造を示す図である。
【図５】図３の表記を略し、オブジェクト３００を丸で囲むＡ、Ｂ等で示したものである。
【図６】図２のステップ１０３の時点のヒープメモリ３０の状態の一例を示す図である。
【図７】本実施例のヒープダンプ取得機能により出力されたファイルを解析する際に用いるアプリケーションの画面例である。
【符号の説明】
【００２０】
１０  プログラム実行部
２０  ヒープメモリ管理部
３０  ヒープメモリ
４０  ファイル格納部
５０  操作入力部
６０  画面出力部
７０  プログラム
【図１】
2006350876.tif 000003
【図２】
2006350876.tif 000004
【図３】
2006350876.tif 000005
【図４】
2006350876.tif 000006
【図５】
2006350876.tif 000007
【図６】
2006350876.tif 000008
【図７】
2006350876.tif 000009