(57)【要約】【課題】単一の計算機で複数のプログラムがオブジェクトを共有しながら動作する場合に、各プログラム固有のオブジェクトを追跡することによって、各プログラムのリソース量を算出する方法を提供する。【解決手段】複数のプログラムを実行するプロセッサ、及びプロセッサに接続され、複数のプログラムを格納する記憶部を備える計算機であって、計算機は、複数のプログラムを実行することによって複数のオブジェクトを生成するプログラム実行部を備え、オブジェクトは、他のオブジェクトの識別情報を含む参照を有し、複数のオブジェクトは、複数のオブジェクトによって参照される共有オブジェクトを含み、プログラム実行部は、共有オブジェクトを参照する第１のオブジェクトと、共有オブジェクトに含まれる参照によって第１のオブジェクトから参照される第２のオブジェクトとの対応を特定し、プログラムが利用するオブジェクトを特定する。【選択図】図５
2012221147.tif 000002
【特許請求の範囲】
【請求項１】
複数のプログラムを実行するプロセッサ、及び前記プロセッサに接続され、前記複数のプログラムを格納する記憶部を備える計算機であって、
前記計算機は、前記複数のプログラムを実行することによって複数のオブジェクトを生成するプログラム実行部を備え、
前記オブジェクトは、他のオブジェクトの識別情報を含む参照を有し、
前記複数のオブジェクトは、複数の前記オブジェクトによって参照される共有オブジェクトを含み、
前記プログラム実行部は、
前記共有オブジェクトを参照する第１のオブジェクトと、前記共有オブジェクトに含まれる前記参照によって前記第１のオブジェクトから参照される第２のオブジェクトとの対応を特定し、
前記プログラム毎に、当該プログラムが利用する前記オブジェクトを特定することを特徴とする計算機。
【請求項２】
前記計算機は、前記第１のオブジェクトの識別情報及び前記第２のオブジェクトの識別情報を含む追跡情報を格納し、
前記プログラム実行部は、
前記第２のオブジェクトの識別情報を含む前記参照を引数とする前記第１のオブジェクトからのメソッドの呼び出しを検出した場合に、当該メソッドに基づいて、前記第１のオブジェクトの識別情報及び前記第２のオブジェクトの識別情報を取得し、
取得された前記第１のオブジェクトの識別情報及び前記第２のオブジェクトの識別情報を前記追跡情報に格納し、
前記追跡情報に基づいて、前記プログラム毎に、当該プログラムが利用する前記オブジェクトを特定することを特徴とする請求項１に記載の計算機。
【請求項３】
前記計算機は、前記共有オブジェクトに対する、前記第２のオブジェクトを示す前記参照を引数とする前記第１のオブジェクトからのメソッドの呼び出しを検出するための追跡ルール情報を備え、
前記プログラム実行部は、
前記追跡ルール情報に基づいて、前記第２のオブジェクトの識別情報を含む前記参照を引数とする前記第１のオブジェクトからのメソッドの呼び出しを検出し、
前記検出されたメソッドの操作対象である前記参照に、前記追跡情報に基づいて追跡すべき旨を表す追跡フラグを付与することを特徴とする請求項２に記載の計算機。
【請求項４】
前記計算機は、前記各プログラムによって使用されるリソース量を算出する算出部を備え、
前記算出部は、
前記プログラムによって生成された、所定の前記複数のオブジェクトから構成されるオブジェクト集合を含む、当該プログラムの使用リソース量の算出要求が入力された場合に、前記追跡情報に基づいて、前記オブジェクト集合に含まれる前記所定のオブジェクトにおける前記参照を追跡することによって前記プログラムが利用するオブジェクトを探索するオブジェクト探索処理を実行して、前記プログラムが利用する全てのオブジェクトを特定し、
前記特定された各オブジェクトの使用リソース量を取得して、前記プログラムに使用されるリソース量を算出することを特徴とする請求項３に記載の計算機。
【請求項５】
前記算出部は、
前記追跡情報の前記第１のオブジェクトの識別情報を参照して、前記オブジェクト集合の中から前記第１のオブジェクトを検索し、
前記第１のオブジェクトが参照する前記共有オブジェクトを検索し、
前記共有オブジェクトにおける前記参照の中から、前記追跡フラグが付与される前記参照を検索し、
前記追跡フラグが付与された参照に基づいて前記追跡情報を参照して、当該参照によって参照される前記第２のオブジェクトに対応するエントリが存在するか否かを判定し、
前記追跡フラグが付与された参照によって参照される前記第２のオブジェクトに対応するエントリが存在すると判定された場合には、前記第２のオブジェクトを新たな入力として前記オブジェクト探索処理を実行することを特徴とする請求項４に記載の計算機。
【請求項６】
前記計算機は、前記オブジェクトに含まれる参照のうち、追跡すべき前記参照を特定するための探索ルール情報を備え、
前記算出部は、
探索ルール情報に基づいて、前記処理対象であるオブジェクトにおける前記参照の中から前記追跡すべき参照を特定し、
前記特定された追跡すべき参照が示す前記オブジェクトを入力として前記オブジェクト探索処理を実行することを特徴とする請求項４に記載の計算機。
【請求項７】
前記オブジェクトの識別情報は、所定の長さのビット列から構成され、
前記参照に含まれるオブジェクトの識別情報である前記ビット列のうち、未使用のビットに前記追跡フラグを割り当てることを特徴とする請求項４に記載の計算機。
【請求項８】
前記計算機は、前記プログラム毎の使用リソース量の上限を表す閾値を格納し、
前記算出部は、
前記算出されたプログラムの使用リソース量が、当該プログラムに対応する前記閾値より大きいか否かを判定し、
前記算出されたプログラムの使用リソース量が、当該プログラムに対応する前記閾値より大きいと判定された場合には、当該プログラムを終了させることを特徴とする請求項４に記載の計算機。
【請求項９】
複数のプログラムを実行するプロセッサ、及び前記プロセッサに接続され、前記複数のプログラムを格納する記憶部を備える計算機におけるリソース管理方法であって、
前記計算機は、前記複数のプログラムを実行することによって複数のオブジェクトを生成するプログラム実行部を備え、
前記オブジェクトは、他のオブジェクトの識別情報を含む参照を有し、
前記複数のオブジェクトは、複数の前記オブジェクトによって参照される共有オブジェクトを含み、
前記リソース管理方法は、
前記プロセッサが、前記共有オブジェクトを参照する第１のオブジェクトと、前記共有オブジェクトに含まれる前記参照によって前記第１のオブジェクトから参照される第２のオブジェクトとの対応を特定するステップと、
前記プロセッサが、前記プログラム毎に、当該プログラムが利用する前記オブジェクトを特定するステップと、を含むことを特徴とするリソース管理方法。
【請求項１０】
前記計算機は、さらに、前記第１のオブジェクトの識別情報及び前記第２のオブジェクトの識別情報を含む追跡情報を格納し、
前記リソース管理方法は、
前記プロセッサが、前記第２のオブジェクトの識別情報を含む前記参照を引数とする前記第１のオブジェクトからのメソッドの呼び出しを検出した場合に、当該メソッドに基づいて、前記第１のオブジェクトの識別情報及び前記第２のオブジェクトの識別情報を取得するステップと、
前記プロセッサが、取得された前記第１のオブジェクトの識別情報及び前記第２のオブジェクトの識別情報を前記追跡情報に格納するステップと、
前記プロセッサが、前記追跡情報に基づいて、前記プログラム毎に、当該プログラムが利用する前記オブジェクトを特定するステップと、を含むことを特徴とする請求項９に記載のリソース管理方法。
【請求項１１】
前記計算機は、さらに、前記共有オブジェクトに対する、前記第２のオブジェクトを示す前記参照を引数とする前記第１のオブジェクトからのメソッドの呼び出しを検出するための追跡ルール情報を備え、
前記リソース管理方法は、
前記プロセッサが、前記追跡ルール情報に基づいて、前記第２のオブジェクトの識別情報を含む前記参照を引数とする前記第１のオブジェクトからのメソッドの呼び出しを検出するステップと
前記プロセッサが、前記検出されたメソッドの操作対象である前記参照に、前記追跡情報に基づいて追跡すべき旨を表す追跡フラグを付与するステップと、を含むことを特徴とする請求項１０に記載のリソース管理方法。
【請求項１２】
前記計算機は、さらに、前記各プログラムによって使用されるリソース量を算出する算出部を備え、
前記リソース管理方法は、
前記プロセッサが、前記プログラムによって生成された、所定の前記複数のオブジェクトから構成されるオブジェクト集合を含む、当該プログラムの使用リソース量の算出要求が入力された場合に、前記追跡情報に基づいて、前記オブジェクト集合に含まれる前記所定のオブジェクトにおける前記参照を追跡することによって前記プログラムが利用するオブジェクトを探索するオブジェクト探索処理を実行して、前記プログラムが利用する全てのオブジェクトを特定するステップと、
前記特定された各オブジェクトの使用リソース量を取得して、前記プログラムの使用リソース量を算出するステップと、を含むことを特徴とする請求項１１に記載のリソース管理方法。
【請求項１３】
前記プログラムが利用する全てのオブジェクトを特定するステップでは、
前記プロセッサが、前記追跡情報の前記第１のオブジェクトの識別情報を参照して、前記オブジェクト集合の中から前記第１のオブジェクトを検索するステップと、
前記プロセッサが、前記第１のオブジェクトが参照する前記共有オブジェクトを検索するステップと、
前記プロセッサが、前記共有オブジェクトにおける前記参照の中から、前記追跡フラグが付与される前記参照を検索するステップと、
前記プロセッサが、前記追跡フラグが付与された参照に基づいて前記追跡情報を参照して、当該参照によって参照される前記第２のオブジェクトに対応するエントリが存在するか否かを判定するステップと、
前記プロセッサが、前記追跡フラグが付与された参照によって参照される前記第２のオブジェクトに対応するエントリが存在すると判定された場合には、前記第２のオブジェクトを新たな入力として、新たに前記オブジェクト探索処理を実行するステップと、を含むことを特徴とする請求項１２に記載のリソース管理方法。
【請求項１４】
前記計算機は、さらに、前記オブジェクトに含まれる参照のうち、追跡すべき前記参照を特定するための探索ルール情報を備え、
前記プログラムが利用する全てのオブジェクトを特定するステップでは、
前記プロセッサが、探索ルール情報に基づいて、前記処理対象であるオブジェクトにおける前記参照の中から前記追跡すべき参照を特定するステップと、
前記プロセッサが、前記特定された追跡すべき参照が示す前記オブジェクトを入力として前記オブジェクト探索処理を実行するステップと、を含むことを特徴とする請求項１２に記載のリソース管理方法。
【請求項１５】
前記オブジェクトの識別情報は、所定の長さのビット列から構成され、
前記参照に含まれるオブジェクトの識別情報である前記ビット列のうち、未使用のビットに前記追跡フラグを割り当てることを特徴とする請求項１２に記載のリソース管理方法。
【請求項１６】
前記計算機は、前記プログラム毎の使用リソース量の上限を表す閾値を格納し、
前記リソース管理方法は、
前記プロセッサが、前記算出されたプログラムの使用リソース量が、当該プログラムに対応する前記閾値より大きいか否かを判定するステップと、
前記プロセッサが、前記算出されたプログラムの使用リソース量が、当該プログラムに対応する前記閾値より大きいと判定された場合には、当該プログラムを終了させるステップと、を含むことを特徴とする請求項１２に記載のリソース管理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のアプリケーションが単一のメモリ領域を共有して実行される計算機において、各アプリケーションのリソース使用を管理する方法及び計算機に関する。
【背景技術】
【０００２】
携帯端末装置等の組込みシステムでは、ユーザによるプログラムの追加及び削除が容易に行えるという利点からアプリケーション実行の手段としてＪａｖａ（登録商標、以下同じ）又は共通言語基盤（ＩＳＯ／ＩＥＣ２３２７１）等の仮想マシン技術が採用される。
【０００３】
通常、仮想マシンは、計算機の処理を抽象化した仮想的な計算機の命令列を実行するインタプリタとして実装される。これによって、組み込みシステム等のハードウェア及びＯＳ等に依存することなく同一のアプリケーションを実行することができる。
【０００４】
インタプリタは、メモリから命令列を読み出し、読み出された順次に当該命令列を解釈し、解釈された命令列を実行する。
【０００５】
このとき、メモリ上に構成される先入れ後出し型のデータ構造であるスタックに一時的な計算結果が格納され、また、ヒープメモリ上に互いに参照関係を持つことが可能なデータ構造であるオブジェクトが作成される。
【０００６】
仮想マシンにおいて、オブジェクトの生成操作はプログラム動作中に何度も実行されるため、プログラムによって無制限にヒープメモリの領域確保が要求されることとなる。そこで、ヒープメモリ上のオブジェクトの量を管理する種々の方法が考えられている。
【０００７】
例えば、ヒープメモリにおけるサイズの最大値を設定し、仮想マシンが使用するメモリ量を制限することによって、オブジェクトの量を管理することができる。
【０００８】
プログラムが設定されたヒープメモリにおけるサイズの最大値を超えてオブジェクト生成を要求すると、ガーベジコレクタが動作した後に空き容量がないと判定され、メモリ不足エラーを示す例外が発生し、当該オブジェクトの生成要求は失敗する。
【０００９】
しかし、前述の方法ではヒープメモリ全体の使用量のみを制限するため、より細かな制御を行いたい場合には適用できない。
【００１０】
例えば、ＯＳＧｉ（登録商標、以下同じ）等のモジュールフレームワークでは、動的リンク時にアプリケーション毎に独立した名前空間でモジュール間のシンボル解決を行うことによって、複数のアプリケーションを同一の仮想マシン上で動作できる。
【００１１】
また、ＯＳＧｉ等のモジュールフレームワークでは、一部のモジュールを共有するようにリンクさせることもできる。この場合、全てのアプリケーションによって使用されるヒープメモリの合計使用量を制限することはできるが、アプリケーション毎のメモリ使用量を制限できない。
【００１２】
前述した問題点に対して、仮想マシンが使用するリソースをより細かな単位で管理する方法が知られている（例えば、特許文献１〜３参照）。
【００１３】
特許文献１には、アプリケーションを構成するオブジェクトを複数のグループに分割し、それぞれのグループにおけるメモリ消費量に対して上限を設定するメモリ量的制御方法が記載されている。
【００１４】
特許文献２には、リソース管理対象となる個別機能モジュール毎に保持されるリソース管理情報に基づいて、個別機能モジュールによって使用されるメモリ量、及び個別機能モジュールの実行時に共通機能モジュールによって使用されるメモリ量を制限するリソース管理方法が記載されている。
【００１５】
また、特許文献３記載には、ヒープメモリの使用量をオブジェクト生成元のクラスローダ単位で管理するヒープサイズ管理表を備え、所定の閾値を超えたクラスローダがある場合に、メモリ使用量が閾値を超えた旨を当該クラスローダに通知するメモリ管理方法が記載されている。
【先行技術文献】
【特許文献】
【００１６】
【特許文献１】特開２００３−７６５６２号公報
【特許文献２】特開２００６−２０９７３５号公報
【特許文献３】特開２００９−２１１６５４号公報
【発明の概要】
【発明が解決しようとする課題】
【００１７】
アプリケーション毎に仮想マシンが分離されている場合、あるアプリケーションのメモリ使用量は、当該アプリケーションが実行される仮想マシンのヒープメモリの使用量に対応する。したがって、例えば、仮想マシン内の全オブジェクトのメモリ使用量を算出することによってアプリケーションの使用メモリ量を求めることができる。
【００１８】
しかし、メモリ使用量を低減するために単一の仮想マシン上で複数のアプリケーションを動作させる場合、アプリケーション間で一部のオブジェクトが共有されるため、アプリケーション毎の消費メモリ量を求めることは難しい。
【００１９】
各アプリケーションのメモリ使用量を求めるために、例えば、オブジェクトのグラフをたどり、各アプリケーションが参照するオブジェクトを探索することが考えられる。しかし、前述した方法では、参照関係から複数のアプリケーションによって共有されていることしか把握できない。
【００２０】
また、特許文献１に記載の発明では、複数のアプリケーションによってオブジェクトが共有される状況を想定しておらず、そのまま適用することはできない。
【００２１】
特許文献２に記載の発明では、アプリケーションそのものを変更する必要があり、既存のアプリケーションには適用できない。
【００２２】
特許文献３に記載の発明では、クラスローダ単位でメモリ使用量を管理しているためアプリケーション単位のメモリ使用量を算出することができない。
【００２３】
したがって、アプリケーション間で一部のオブジェクトが共有されていると、当該オブジェクト配下にオブジェクトがどのアプリケーションによって使用されているか把握することが困難となる。
【００２４】
なぜなら、参照関係からは複数のアプリケーションによって共有されているとしか解釈できず、オブジェクトを正しく分類することができないためである。
【００２５】
図１３Ａ、図１３Ｂ及び図１４は、本発明を完成するにあたり発明者が先立って検討した、アプリケーション及びオブジェクトの関係を表すオブジェクトグラフを示す説明図である。
【００２６】
図１３Ａ及び図１３Ｂは、各アプリケーションを独立の仮想マシン上で実行させた場合のオブジェクトグラフの一例を示す図である。
【００２７】
図１４は、複数のアプリケーションを一つの仮想マシン上で実行させた場合のオブジェクトグラフの一例を示す図である。
【００２８】
図１３に示すように、アプリケーションＡは、アプリケーション自身のモジュールのオブジェクトであるオブジェクト１３０１、並びに、他のモジュールによって提供されるオブジェクト１３０２、１３０３、１３０４及び１３０５から構成されている。
【００２９】
また、アプリケーションＢは、アプリケーション自身のモジュールのオブジェクトであるオブジェクト１３１１、並びに、他のモジュールによって提供されるオブジェクト１３１２、１３０３、１３１４及び１３１５から構成されている。
【００３０】
アプリケーションＡ及びアプリケーションＢの両方に含まれるオブジェクト１３０３は同一の機能をもったオブジェクトであるが、各アプリケーションが異なる仮想マシン上で独立して実行されているため、実体は別のオブジェクトである。
【００３１】
図１４では、アプリケーションＡ及びアプリケーションＢが同一の仮想マシン上で実行される。オブジェクト１３０３はアプリケーションＡ及びアプリケーションＢによって共有される。
【００３２】
したがって、オブジェクトグラフをたどるだけでは、オブジェクト１３０４及びオブジェクト１３１４がどのアプリケーションから利用されているか把握することができない。つまり、オブジェクト１３０３、オブジェクト１３０４及びオブジェクト１３１４のメモリ使用量は共有されているとしか分からない。
【００３３】
本発明の目的は、前述したようなオブジェクトを正しく分類することである。
【課題を解決するための手段】
【００３４】
本発明の代表的な一例を示せば以下の通りである。すなわち、複数のプログラムを実行するプロセッサ、及び前記プロセッサに接続され、前記複数のプログラムを格納する記憶部を備える計算機であって、前記計算機は、前記複数のプログラムを実行することによって複数のオブジェクトを生成するプログラム実行部を備え、前記オブジェクトは、他のオブジェクトの識別情報を含む参照を有し、前記複数のオブジェクトは、複数の前記オブジェクトによって参照される共有オブジェクトを含み、前記プログラム実行部は、前記共有オブジェクトを参照する第１のオブジェクトと、前記共有オブジェクトに含まれる前記参照によって前記第１のオブジェクトから参照される第２のオブジェクトとの対応を特定し、前記プログラム毎に、当該プログラムが利用する前記オブジェクトを特定する。
【発明の効果】
【００３５】
本発明の一形態によれば、単一の計算機上で複数のプログラムを実行させる場合に、プログラム間でオブジェクトの共有が生じた場合であっても、共有オブジェクトにおける参照を追跡することによってプログラムが利用するオブジェクトを分類することができる。
【図面の簡単な説明】
【００３６】
【図１】本発明の第一の実施形態における計算機の構成例を示すブロック図である。
【図２】本発明の第一の実施形態における計算機の論理構成の一例を示すブロック図である。
【図３】本発明の第一の実施形態におけるヒープメモリ上のオブジェクトのデータ構造の一例を示す説明図である。
【図４】本発明の第一の実施形態における参照追跡テーブルの一例を示す説明図である。
【図５】本発明の第一の実施形態における参照追跡ルールテーブルの一例を示す説明図である。
【図６】本発明の第一の実施形態におけるオブジェクト探索ルールテーブルの一例を示す説明図である。
【図７】本発明の第一の実施形態における参照追跡テーブルの更新処理を説明するフローチャートである。
【図８】第一の実施形態における計数処理実行部が実行する集計処理について説明するフローチャートである。
【図９】本発明の第一の実施形態におけるオブジェクト探索処理の詳細を説明するフローチャートである。
【図１０】本発明の第二の実施形態における計算機の論理構成の一例を示すブロック図である。
【図１１】本発明の第二の実施形態における資源制限テーブルの一例を示す説明図である。
【図１２】本発明の第二の実施形態における資源監視部によって実行される処理を説明するフローチャートである。
【図１３Ａ】本発明の課題を説明するための、アプリケーション及びオブジェクトの関係を表すオブジェクトグラフを示す説明図である。
【図１３Ｂ】本発明の課題を説明するための、アプリケーション及びオブジェクトの関係を表すオブジェクトグラフを示す説明図である。
【図１４】本発明の課題を説明するための、アプリケーション及びオブジェクトの関係を表すオブジェクトグラフを示す説明図である。
【発明を実施するための形態】
【００３７】
［第一の実施形態］
図１は、本発明の第一の実施形態における計算機の構成例を示すブロック図である。
【００３８】
計算機１００は、プロセッサ１０１、アドレス変換装置１０２、メモリ１０３及び二次記憶装置１０４を備え、各構成はアドレス／データバス１０５を介して接続される。
【００３９】
プロセッサ１０１は、メモリ１０３に格納されるプログラムを実行することによって、計算機が備える機能を実現する。
【００４０】
アドレス変換装置１０２は、プロセッサ１０１が実行するプロセス毎に割り当てられた仮想アドレスと、メモリ１０３の物理アドレスとの間の変換処理を実行する。
【００４１】
メモリ１０３は、プロセッサ１０１によって実行されるプログラム及び当該プログラムの実行に必要な情報を格納する。メモリ１０３には、仮想マシンを実現するためのプログラムが格納される。ここで、仮想マシンとは、ＯＳ及びハードウェアに依存することなくアプリケーション等を実行するための環境を実現するためのインタプリタを表す。
【００４２】
二次記憶装置１０４は、装置の電源のＯＮ／ＯＦＦにかかわらずデータが格納されている。なお、メモリ１０３上に展開されるプログラムは、二次記憶装置１０４に格納されてもよい。この場合、二次記憶装置１０４からメモリ１０３上にプログラムが読み出され、プロセッサ１０１によって実行される。
【００４３】
なお、計算機１００は、ネットワークインタフェース及び入出力装置等の他の構成を含んでもよい。
【００４４】
図２は、本発明の第一の実施形態における計算機１００の論理構成の一例を示すブロック図である。
【００４５】
計算機１００は、メモリ１０３上に、作業用記憶部２０１、プログラム格納部２０４、プログラム実行部２０５、参照追跡テーブル格納部２０６、計数処理実行部２０７、参照追跡ルール格納部２０８及びオブジェクト探索ルール格納部２０９を備える。なお、前述した各構成は個別のハードウェアを用いて実現してもよい。
【００４６】
作業用記憶部２０１は、処理の実行時に使用される記憶領域であり、ヒープメモリ２０２及びスタック２０３を含む。ヒープメモリ２０２にはオブジェクトが格納され、スタック２０３には計算結果が一時的に格納される。
【００４７】
プログラム格納部２０４は、計算機が備える機能を実現するためのプログラム（例えば、アプリケーションプログラム）を格納する記憶領域である。
【００４８】
プログラム実行部２０５は、プログラム格納部２０４に格納されるプログラムを実行する。具体的には、プログラム実行部２０５は、スタック２０３を一時的な作業領域として用いてプログラムを実行し、また、当該プログラムの実行結果に基づいてヒープメモリ２０２に格納される情報を更新する。
【００４９】
参照追跡テーブル格納部２０６は、参照追跡テーブル４０１（図４参照）を格納する。参照追跡テーブル４０１は、追跡すべき「参照」に関する情報を格納する。ここで、「参照」とは、参照先を示すメモリ１０３上のアドレス（オブジェクトＩＤ）を保持するデータ構造のことを表す。参照追跡テーブル４０１（図４参照）の詳細は、図４を用いて後述する。
【００５０】
参照追跡ルール格納部２０８は、参照追跡ルールテーブル５０１（図５参照）を格納する。参照追跡ルールテーブル５０１は、追跡すべき「参照」を決定するためのルールを格納する。参照追跡ルールテーブル５０１の詳細は、図５を用いて後述する。
【００５１】
オブジェクト探索ルール格納部２０９は、オブジェクト探索ルールテーブル６０１（図６参照）を格納する。オブジェクト探索ルールテーブル６０１は、ヒープメモリ２０２上のオブジェクトの探索方法を指定するルールを格納する。
【００５２】
計数処理実行部２０７は、参照追跡テーブル４０１（図４参照）及びオブジェクト探索ルールテーブル６０１（図６参照）に基づいて、任意のオブジェクト集合をルート（基点）集合としてオブジェクト探索処理を実行し、各オブジェクトのメモリ使用量を算出する。
【００５３】
なお、図２では、ヒープメモリ２０２上における不要なオブジェクトを自動的に回収する機能を有するガーベジコレクタ等の他の構成要素については説明を省略している。
【００５４】
図３は、本発明の第一の実施形態におけるヒープメモリ２０２上のオブジェクトのデータ構造の一例を示す説明図である。
【００５５】
図３では、オブジェクト３０１、オブジェクト３１５及びオブジェクト３１６の対応関係及びデータ構造を表す。
【００５６】
オブジェクト３０１は、メタ情報及びフィールドから構成される。
【００５７】
メタ情報は、オブジェクトＩＤ３０２、クラス３０３及びマークビット集合３０４を含む。
【００５８】
オブジェクトＩＤ３０２は、オブジェクト３０１を一意に識別するための識別子である。例えば、オブジェクトＩＤ３０２には、オブジェクト３０１が格納されたメモリ領域の先頭アドレスが用いられる。
【００５９】
クラス３０３は、オブジェクト３０１が属するクラスを定義するクラス情報を識別するための識別子である。図示していないが、クラス情報には、オブジェクトに対する操作を表すメソッドの集合、及び、各フィールドにおけるデータ構造を表す型情報が含まれる。オブジェクトに適用可能な操作は、クラス情報に含まれるメソッドの集合によって規定される。
【００６０】
マークビット集合３０４は、モジュールに含まれるクラスのオブジェクト集合を識別するためのビット列である。ここで、モジュールには、アプリケーション及びライブラリ等を含むものとする。
【００６１】
フィールドは、フィールド名３０５及びフィールド値３０６を含む。
【００６２】
フィールド名３０５は、オブジェクト３０１中のフィールドを一意に識別する識別子である。
【００６３】
フィールド値３０６は、オブジェクト３０１の状態を表す具体的なデータである。フィールド値３０６は、数値を格納できるデータ構造、又は、「参照」と呼ばれる他のオブジェクトのオブジェクトＩＤ（アドレス）を格納できるデータ構造となっている。
【００６４】
図３に示す例では、行３０７のフィールド名３０５には「ｃｏｕｎｔ」が格納され、フィールド値３０６には数値「２０」が格納される。行３０８のフィールド名３０５には「ｏｂｓｅｒｖｅｒ１」が格納され、フィールド値３０６には「参照」が格納される。また、行３０９のフィールド名３０５には「ｏｂｓｅｒｖｅｒ２」が格納され、フィールド値３０６には「参照」が格納される。
【００６５】
本実施形態におけるフィールド値３０６に格納される「参照」は、オブジェクトＩＤ３１０及び追跡フラグ３１１から構成されるデータ構造である。
【００６６】
オブジェクトＩＤ３１０は、参照先のオブジェクトの識別子である。オブジェクトＩＤ３１０にはメモリアドレスが用いられているため、各オブジェクトは互いに「参照」を通じてそれぞれの位置を指し示すこととなる。
【００６７】
行３０７のフィールド値３０６には、オブジェクト３１５を指定するオブジェクトＩＤ３１０「０ｘ０００２０００（１６進数）」が「参照」として格納される。行３０８のフィールド値３０６には、オブジェクト３１６を指定するオブジェクトＩＤ３１０「０ｘ０００３０００（１６進数）」が「参照」として格納される。
【００６８】
オブジェクト３１５及びオブジェクト３１６は、同様にオブジェクトＩＤ３０２及びクラス３０３を含むメタ情報から構成される。メタ情報は、オブジェクト３０１と同一のものであるため説明を省略する。なお、オブジェクト３１５及びオブジェクト３１６にはフィールドが含まれてもよい。
【００６９】
前述したように「参照」を用いてオブジェクト間の関係を表すことによって、リンクリストやハッシュテーブル等の複雑なデータ構造を表現することができる。
【００７０】
追跡フラグ３１１は、既定値が「０」であり、少なくとも１ビットの幅を持つデータである。追跡フラグ３１１は、計数処理実行部５０７が計数処理を実行する場合に、ルート集合となるオブジェクト集合とは別に、所定のオブジェクトを起点としてオブジェクトグラフをたどる必要があることを示す変数である。
【００７１】
ただし、追跡フラグ３１１は独立したデータ項目である必要はなく、オブジェクトＩＤ３０２の未使用ビットに割り当ててもよい。
【００７２】
例えば、４バイト境界でオブジェクトが配置される場合、アドレス値であるオブジェクトＩＤ３０２の下位２ビットは未使用の「００（２進数）」であるため、当該下位２ビットのいずれかを追跡フラグ３１１に割り当てることができる。
【００７３】
また、上位ビットに使用されていないビットがある場合には、当該未使用の上位ビットを追跡フラグ３１１として割り当ててもよい。なお、この場合、アドレス値として解釈する場合、追跡フラグ３１１を「０」に設定された後にアドレス値として使用する必要がある。
【００７４】
上位ビットを追跡フラグ３１１として割り当てる場合には、アドレス変換装置１０２を用いて、「参照」のオブジェクトＩＤ３１０をそのままアドレス値として解釈できるように、複数の仮想アドレス領域にヒープメモリ２０２を割り当てることができる。この場合、アドレス値として解釈してもメモリに対する読み出し処理及び書き込み処理は正常に実行される。
【００７５】
図４は、本発明の第一の実施形態における参照追跡テーブル４０１の一例を示す説明図である。
【００７６】
参照追跡テーブル４０１は、追跡すべき「参照」に関する情報を格納する。参照追跡テーブル４０１は、参照先オブジェクトＩＤ４０２及び所属オブジェクトＩＤ４０３を含む。
【００７７】
参照先オブジェクトＩＤ４０２は、追跡すべき「参照」が保持するオブジェクトＩＤである。すなわち、追跡すべき「参照」によって指定された参照先のオブジェクトのアドレス値である。例えば、図１４において、オブジェクト１３０４及びオブジェクト１３１４への「参照」が追跡すべき「参照」となる。
【００７８】
以下、追跡すべき「参照」によって指定された参照先のオブジェクトを参照先オブジェクトとも記載する。
【００７９】
参照先オブジェクトＩＤ４０２には、追跡すべき「参照」をフィールドに保持するオブジェクトのオブジェクトＩＤをも含まれる。例えば、図１４において、オブジェクト１３０３が追跡すべき「参照」をフィールドに保持するオブジェクトとなる。
【００８０】
以下、追跡すべき「参照」を保持するオブジェクトを共有オブジェクトとも記載する。
【００８１】
所属オブジェクトＩＤ４０３は、共有オブジェクトを指定する「参照」をフィールドに保持するオブジェクトのオブジェクトＩＤである。例えば、図１４において、オブジェクト１３０２及びオブジェクト１３１２が共有オブジェクトを指定する「参照」をフィールドに保持するオブジェクトとなる。
【００８２】
以下、共有オブジェクトを指定する「参照」をフィールドに保持するオブジェクトを所属オブジェクトとも記載する。また、所属オブジェクトは、共有オブジェクトをフィールドに必ずしも保持している必要はない。例えば、参照追跡テーブルのエントリを作成するメソッド呼び出し後に、フィールドの値がクリアされる場合がある。すなわち、後述するメソッド呼び出し処理によって、追跡すべき「参照」を発生させたオブジェクトともいえる。
【００８３】
なお、計算機１００は、共有オブジェクト毎に一つの参照追跡テーブル４０１を備えていてもよい。この場合、参照先オブジェクトＩＤ４０２には、共有オブジェクトのオブジェクトＩＤが含まれない。
【００８４】
本実施形態では、計算機１００が参照追跡テーブル４０１を備えることによって、オブジェクト間の参照関係を把握することが可能となる。より具体的には、計算機１００は、参照追跡テーブル４０１を備えることによって、所属オブジェクトを追跡すべき「参照」の参照元として扱うことができる。すなわち、所属オブジェクトが参照先オブジェクトを参照することが分かる。
【００８５】
なお、本発明は、参照追跡テーブル４０１のようにテーブル形式のデータに限定されず、同様の情報を保持するデータ形式であればどのような形式であってもよい。
【００８６】
図５は、本発明の第一の実施形態における参照追跡ルールテーブル５０１の一例を示す説明図である。
【００８７】
参照追跡ルールテーブル５０１は、プログラム実行部２０５が追跡すべき「参照」を特定するための情報を格納する。参照追跡ルールテーブル５０１は、クラス５０２、メソッド名５０３、代入値５０４及び引数番号５０５を含む。
【００８８】
クラス５０２は、オブジェクトが所属するクラスを識別するための識別子である。
【００８９】
メソッド名５０３は、クラス５０２に対応するクラスにおけるメソッドを識別するための識別子である。
【００９０】
代入値５０４は、追跡フラグ３１１に代入する値である。
【００９１】
引数番号５０５は、メソッドに設定された引数のうち、追跡すべき「参照」を示す引数の番号である。
【００９２】
例えば、行５１３におけるメソッドには２つの引数が含まれており、２つ目の引数を示す「２（％２）」が引数番号５０５に格納される。引数番号５０５に「０」が格納される場合、メソッドの返り値を表す。
【００９３】
なお、本発明は、参照追跡ルールテーブル５０１のようにテーブル形式のデータに限定されず、同様の情報を保持するデータ形式であればどのような形式であってもよい。
【００９４】
図６は、本発明の第一の実施形態におけるオブジェクト探索ルールテーブル６０１の一例を示す説明図である。
【００９５】
オブジェクト探索ルールテーブル６０１は、ヒープメモリ２０２上のオブジェクトの探索方法に関するルールを格納する。オブジェクト探索ルールテーブル６０１は、クラス６０２、フィールド６０３及び処理種別６０４を含む。
【００９６】
クラス６０２は、オブジェクトが所属するクラスを識別するための識別子である。なお、クラス６０２は、クラス５０２と同一の情報である。
【００９７】
フィールド６０３は、オブジェクトを構成するフィールドを識別するための識別子である。なお、フィールド６０３には、オブジェクトにおける全てのフィールドを表す記号が格納されてもよいし、また、複数のフィールドが格納されてもよい。
【００９８】
処理種別６０４は、オブジェクト探索処理を実行するか否かを示す情報である。具体的には、処理種別６０４には「ＴＲＡＣＥ」又は「ＳＫＩＰ」のいずれかが格納される。「ＴＲＡＣＥ」はオブジェクト探索処理の実行を示す。また、「ＳＫＩＰ」はオブジェクト探索処理の省略を示す。
【００９９】
本実施形態の計数処理実行部２０７は、オブジェクト探索ルールテーブル６０１を参照して、クラス６０２及びフィールド６０３が一致するオブジェクトを探索し、探索されたオブジェクトに対して処理種別６０４に対応した処理を実行する。
【０１００】
なお、オブジェクト探索ルールテーブル６０１に一致しない「参照」については、探索処理が必ず実行されるものとする。
【０１０１】
なお、本発明は、オブジェクト探索ルールテーブル６０１のようにテーブル形式のデータに限定されず、同様の情報を保持するデータ形式であればどのような形式であってもよい。
【０１０２】
図７は、本発明の第一の実施形態における参照追跡テーブル４０１の更新処理を説明するフローチャートである。
【０１０３】
プログラム実行部２０５が、参照追跡ルールテーブル５０１と一致する特定の識別子（メソッドシグニチャ）を有するメソッドを呼び出した時に、以下で説明する参照追跡テーブル４０１の更新処理が実行される。
【０１０４】
より具体的には、共有オブジェクトに適用可能なメソッドが呼び出された時に参照追跡テーブル４０１の更新処理が実行される。
【０１０５】
まず、プログラム実行部２０５は、メソッド呼び出し命令を受け付けるとメソッド呼び出し処理を開始する（ステップＳ１）。
【０１０６】
プログラム実行部２０５は、スタック２０３にメソッドの引数を格納（プッシュ）し、さらに、メソッド呼び出し命令の対象となるレシーバオブジェクトをスタック２０３に格納（プッシュ）し、メソッド呼び出し命令を実行する（ステップＳ２）。なお、ここでの処理は一般的なメソッド呼び出しを含んでいるので、レシーバオブジェクトは共有オブジェクトに限定されるものではない。
【０１０７】
なお、メソッド呼び出し命令には、呼び出すメソッドのメソッド名が含まれており、プログラム実行部２０５は、メソッド名及びレシーバオブジェクトの属するクラスに基づいて、呼び出すメソッドを特定できる。
【０１０８】
次に、プログラム実行部２０５は、レシーバオブジェクトの属するクラス及び呼び出すメソッドのメソッド名に基づいて参照追跡ルールテーブル５０１を参照して、対応するエントリを検索する（ステップＳ３）。
【０１０９】
具体的には、プログラム実行部２０５は、参照追跡ルールテーブル５０１のクラス５０２及びメソッド名５０３を参照し、レシーバオブジェクトが属するクラス及び呼び出すメソッドのメソッド名と一致するエントリが存在するか否かを検索する。
【０１１０】
プログラム実行部２０５は、前述の検索の結果、対応するエントリが存在するか否かを判定する（ステップＳ４）。すなわち、追跡すべき「参照」を保持する共有オブジェクトを指定する「参照」であるか否かが判定される。ここで、エントリが存在すれば、レシーバオブジェクトを共有オブジェクトとみなし、メソッド呼び出しで引数として渡される参照を追跡できるようにする処理が実行される。
【０１１１】
対応するエントリが存在しないと判定された場合、プログラム実行部２０５は、更新処理を終了して、メソッド呼び出し処理を継続する（ステップＳ８）。
【０１１２】
対応するエントリが存在すると判定された場合、プログラム実行部２０５は、対応するエントリの引数番号５０５が「０」であるか否かを判定する（ステップＳ５）。
【０１１３】
ステップＳ３〜ステップＳ５では、追跡すべき「参照」を特定するための処理であり、追跡すべき「参照」がある場合には、ステップＳ６において、参照追跡テーブル４０１に必要な情報が追加される。
【０１１４】
対応するエントリの引数番号５０５が「０」でないと判定された場合、プログラム実行部２０５は、参照追跡テーブル４０１を更新する（ステップＳ６）。具体的には、以下のように、参照追跡テーブル４０１が更新される。
【０１１５】
まず、プログラム実行部２０５は、参照追跡テーブル４０１に新たなエントリを生成する。
【０１１６】
プログラム実行部２０５は、生成されたエントリの参照先オブジェクトＩＤ４０２に、引数番号５０５で指定された引数が示す「参照」におけるオブジェクトＩＤを格納する。すなわち、参照先オブジェクトのオブジェクトＩＤが格納される。
【０１１７】
また、プログラム実行部２０５は、生成されたエントリの参照先オブジェクトＩＤ４０２に、レシーバオブジェクトのオブジェクトＩＤを格納する。なお、共有オブジェクト毎に参照追跡テーブル４０１が存在する場合には当該処理は実行されなくともよい。
【０１１８】
プログラム実行部２０５は、生成されたエントリの所属オブジェクトＩＤ４０３に、スタック２０３から取得される現在のスタックフレームに所属するオブジェクト（ｔｈｉｓ参照）のオブジェクトＩＤを格納する。すなわち、所属オブジェクトのオブジェクトＩＤが格納される。
【０１１９】
さらに、プログラム実行部２０５は、引数番号５０５で指定された引数のアドレス値を出力する。
【０１２０】
以上の処理によって、参照先オブジェクトと、所属オブジェクトとの対応関係を把握することが可能となる。
【０１２１】
プログラム実行部２０５は、指定された引数が示す「参照」における追跡フラグ３１１に値を設定する（ステップＳ７）。
【０１２２】
具体的には、プログラム実行部２０５は、指定された引数が示す「参照」の追跡フラグ３１１に、ステップＳ３において検索されたエントリの代入値５０４の値を代入する。
【０１２３】
その後、プログラム実行部２０５は、更新処理を終了して、メソッド呼び出し処理を継続する（ステップＳ８）。
【０１２４】
メソッド呼び出し処理が完了すると、スタック２０３に格納された情報は破棄され、代わりにメソッドの帰り値がスタック２０３に格納（プッシュ）され、処理が終了する。
【０１２５】
ステップＳ５において、引数番号５０５が「０」であると判定された場合、プログラム実行部２０５は、メソッド呼び出し処理を継続する（ステップＳ９）。
【０１２６】
当該メソッド呼び出し処理では、呼び出されたメソッドの帰り値の「参照」のアドレス値が出力される点がステップＳ８と異なる。
【０１２７】
次に、プログラム実行部２０５は、指定された引数が示す「参照」における追跡フラグ３１１に値を設定する（ステップＳ１０）。当該処理は、ステップＳ７と同一の処理である。
【０１２８】
なお、ステップＳ７及びステップＳ１０において追跡フラグ３１１に値が設定された「参照」は、レシーバオブジェクトのフィールド等に複製されていることが期待される。当該複製された「参照」と、ステップＳ６において参照追跡テーブル４０１に新たに追加されたエントリとに基づいて、計数処理実行部２０７が集計処理を実行することとなる。
【０１２９】
図８は、第一の実施形態における計数処理実行部５０７が実行する集計処理について説明するフローチャートである。
【０１３０】
計数処理実行部２０７は、複数のオブジェクト集合の情報が含まれる集計処理の開始要求を受信すると集計処理を開始する（ステップＳ２１）。
【０１３１】
なお、集計処理は、計算機１００を操作するオペレータからの指示を受けてから実行してもよいし、周期的に実行してもよい。
【０１３２】
ここで、オブジェクト集合は、当該モジュールに属するクラスのクラス情報に基づいて生成された全オブジェクトから構成される。フレームワーク（図示省略）がオブジェクト集合を把握しており、当該フレームワークによって各モジュールのオブジェクト集合の情報が入力される。
【０１３３】
なお、初期に入力されるオブジェクト集合には、モジュールに属するクラスのクラス情報から生成されたオブジェクト以外のオブジェクトは含まれない。したがって、後述するオブジェクト探索処理が実行されることとなる。
【０１３４】
なお、オブジェクト集合の情報には、当該オブジェクト集合に含まれるオブジェクトのオブジェクトＩＤが含まれる。
【０１３５】
計数処理実行部２０７は、複数のオブジェクト集合をグループリストＧに追加する（ステップＳ２２）。
【０１３６】
具体的には、計数処理実行部２０７は、ヒープメモリ２０２に格納されるオブジェクトにおけるメタ情報のマークビット集合３０４をクリアし、複数のオブジェクト集合に、各オブジェクト集合を一意に識別するための識別子を付与する。例えば、１から始まる連続した数値を各オブジェクト集合に付与する方法が考えられる。さらに、計数処理実行部２０７は、識別子が付与された各オブジェクト集合をグループリストＧに追加する。
【０１３７】
例えば、識別子が付与された各モジュールに対応するオブジェクト集合は、オブジェクト集合Ｓi（ｉは自然数）と表される。ここで、オブジェクト集合Ｓiは、複数のオブジェクトＯn（ｎは自然数）を含む。このとき、グループリストはＧ＝（Ｓ1、Ｓ2、Ｓ3、…）となる。
【０１３８】
次に、計数処理実行部２０７は、全オブジェクト集合について処理が完了したか否かを判定する（ステップＳ２３）。
【０１３９】
具体的には、グループリストＧが空であるか否かが判定される。グループリストＧが空である場合には、全オブジェクト集合について処理が完了したと判定される。
【０１４０】
全てのオブジェクト集合について処理が完了していないと判定された場合、計数処理実行部２０７は、グループリストＧから一つのオブジェクト集合Ｓiを選択する（ステップＳ２４）。
【０１４１】
選択方法は、例えば、ｉ＝１から順に選択する方法、オブジェクト集合に含まれる要素が少ないものから順に選択する方法などが考えられる。なお、本発明は選択方法に限定されない。
【０１４２】
計数処理実行部２０７は、選択されたオブジェクト集合に対してオブジェクト探索処理を実行する（ステップＳ２５）。なお、探索処理については、図９を用いて後述する。
【０１４３】
ステップＳ２５では、オブジェクト探索ルールテーブル６０１に基づいてオブジェクト探索処理が実行される。当該オブジェクト探索処理によって、一つのオブジェクトを基点としてたどることができるオブジェクトが探索される。
【０１４４】
計数処理実行部２０７は、参照追跡ルールテーブル５０１を参照して、新たな基点となるオブジェクトを特定し、特定されたオブジェクトを選択されたオブジェクト集合に追加する（ステップＳ２６）。
【０１４５】
ステップＳ２５におけるオブジェクト探索処理では、共有オブジェクトにおける「参照」によって指定されたオブジェクトが探索されていない可能性がある。これは、共有オブジェクトにおける「参照」によって指定された参照先オブジェクトがどの所属オブジェクトから参照されているか把握できないためである。
【０１４６】
そこで、ステップＳ２６において、計数処理実行部２０７は、選択されたオブジェクト集合に、追跡すべき「参照」によって指定された参照先オブジェクトを追加する。これによって、当該参照先オブジェクトを基点としたオブジェクト探索処理が可能となる。
【０１４７】
ステップＳ２６では具体的には、以下のような処理が実行される。
【０１４８】
計数処理実行部２０７は、参照追跡テーブル４０１の所属オブジェクトＩＤ４０３を参照して、選択されたオブジェクト集合、及び前ステップＳ２５において辿ったオブジェクト、すなわち選択されたオブジェクト集合に対応するマークビットが立っているオブジェクトの中から、所属オブジェクトＩＤ４０３に一致するオブジェクトを抽出する。
【０１４９】
計数処理実行部２０７は、抽出されたオブジェクトそれぞれのマークビット集合３０４を参照して、選択されたオブジェクト集合に対応するビットが付与されているオブジェクトが存在するか否かを判定する。
【０１５０】
マークビット集合３０４に選択されたオブジェクト集合に対応するビットが付与されているオブジェクトがある場合、計数処理実行部２０７は、当該オブジェクトに対応するエントリの参照先オブジェクトＩＤ４０２を取得する。
【０１５１】
次に、計数処理実行部２０７は、ヒープメモリ２０２上の全オブジェクトの中から追跡フラグが「０」でない「参照」を抽出する。
【０１５２】
計数処理実行部２０７は、抽出された「参照」の中に、取得された参照先オブジェクトＩＤ４０２と一致する「参照」があるか否かを判定する。
【０１５３】
取得された参照先オブジェクトＩＤ４０２と一致する「参照」がある場合、計数処理実行部２０７は、当該「参照」によって指定された参照先オブジェクトを、選択されたオブジェクト集合に追加する。
【０１５４】
以上がステップＳ２６における処理である。
【０１５５】
計数処理実行部２０７は、オブジェクト集合に新たに追加されたオブジェクトに対してオブジェクト探索処理（図９参照）を実行し（ステップＳ２７）、ステップＳ２３に戻り同様の処理を実行する。
【０１５６】
ステップ２３において、全てのオブジェクト集合について処理が完了したと判定された場合、計数処理実行部２０７は、各モジュールのメモリ使用量を算出する（ステップＳ２８）。
【０１５７】
具体的には、以下のような処理が実行される。
【０１５８】
計数処理実行部２０７は、ヒープメモリ２０２上の全オブジェクトのマークビット集合３０４を参照して、マークビット集合３０４に付与されたビットに基づいて、各モジュールに属するオブジェクトを検索する。さらに、計数処理実行部２０７は、検索されたオブジェクトから各モジュールのオブジェクト集合を構成する。
【０１５９】
なお、マークビット集合３０４には各モジュールに対応したビットが付与されており、計数処理実行部２０７は、当該ビットを参照することによって、各オブジェクトがどのモジュールに含まれるか把握できる。
【０１６０】
次に、計数処理実行部２０７は、各モジュールに含まれるオブジェクトのクラス情報（図示省略）等を参照して、各モジュールのメモリ使用量を算出する。なお、オブジェクト毎にメモリ使用量を算出する方法を用いてもよい。すなわち、本発明は、各オブジェクトにおけるメモリ使用量の算出方法に限定されない。
【０１６１】
以上の処理によって各モジュールのメモリ使用量を算出することができる。
【０１６２】
その後、計数処理実行部２０７は、算出された各モジュールのメモリ使用量を通知するための出力情報を生成し、処理を終了する（ステップＳ２９）。
【０１６３】
図９は、本発明の第一の実施形態におけるオブジェクト探索処理の詳細を説明するフローチャートである。
【０１６４】
まず、計数処理実行部２０７は、ステップＳ２４において選択されたオブジェクト集合に含まれるオブジェクトを探索リストに追加する（ステップＳ３１）。
【０１６５】
計数処理実行部２０７は、全てのオブジェクトについて処理が完了したか否かを判定する（ステップＳ３２）。具体的には、探索リストが空であるか否かが判定される。探索リストが空である場合には、全てのオブジェクトについて処理が完了したと判定される。
【０１６６】
全てのオブジェクトについて処理が完了していないと判定された場合、計数処理実行部２０７は、探索リストからオブジェクトを一つ選択する（ステップＳ３３）。
【０１６７】
計数処理実行部２０７は、選択されたオブジェクトにマークビットを付与する（ステップＳ３４）。
【０１６８】
具体的には、計数処理実行部２０７は、選択されたオブジェクトのマークビット集合３０４に、ステップＳ２４において選択されたオブジェクト集合に対応するマークビットをたてる。これによって、選択されたオブジェクトがどのモジュールを構成するオブジェクトであるかを把握することができる。
【０１６９】
例えば、ステップＳ２２においてオブジェクト集合に付与された識別子に対応するマークビットを立てる方法が考えられる。オブジェクト集合に付与された識別子は、各オブジェクト集合固有の識別子であるため、マークビット集合３０４の対応する桁のビットに対応させることができる。
【０１７０】
オブジェクト集合Ｓ2の場合、２桁目のビットが対応しており、ステップＳ３４では２桁目のビットを立てる処理が実行される。より詳細には、マークビット集合３０４の初期値が「００００００００」である場合、オブジェクト集合Ｓ1にのみ所属するオブジェクトのマークビット集合３０４は「０００００００１」、オブジェクト集合Ｓ2にのみ所属するオブジェクトのマークビット集合３０４は「００００００１０」、オブジェクト集合Ｓ1及びオブジェクト集合Ｓ2に所属するオブジェクトは「００００００１１」となる。
【０１７１】
ステップＳ２８では、当該マークビット集合３０４に基づいてオブジェクト集合に所属する全オブジェクトを把握することとなる。
【０１７２】
計数処理実行部２０７は、選択されたオブジェクトに基づいてオブジェクト探索ルールテーブル６０１を参照する（ステップＳ３５）。
【０１７３】
計数処理実行部２０７は、選択されたオブジェクトに追跡すべき「参照」が存在するか否かを判定する（ステップＳ３６）。選択されたオブジェクトにおける「参照」のうち、少なくとも一以上追跡すべき「参照」が存在する場合には、選択されたオブジェクトに追跡すべき「参照」が存在すると判定される。
【０１７４】
具体的には、以下のような処理が実行される。
【０１７５】
まず、計数処理実行部２０７は、選択されたオブジェクトのクラスと一致するクラス６０２であるエントリが存在するか否かを判定する。
【０１７６】
選択されたオブジェクトのクラスと一致するエントリが存在しないと判定された場合、計数処理実行部２０７は、当該オブジェクトにおける全ての「参照」を、追跡すべき「参照」に決定する。
【０１７７】
選択されたオブジェクトのクラスと一致するエントリが存在すると判定された場合、計数処理実行部２０７は、当該エントリのフィールド６０３及び処理種別６０４を参照する。
【０１７８】
当該エントリの処理種別６０４が「ＴＲＡＣＥ」の場合、計数処理実行部２０７は、選択されたオブジェクトにおけるフィールドのうち、フィールド６０３に一致するフィールドを追跡すべき「参照」に決定する。この場合、フィールド６０３に一致しないフィールドは追跡すべき「参照」として扱われない。
【０１７９】
一方、当該エントリの処理種別６０４が「ＳＫＩＰ」の場合、計数処理実行部２０７は、選択されたオブジェクトにおけるフィールドのうち、フィールド６０３に一致するフィールドを追跡すべき「参照」として扱わない。この場合、フィールド６０３に一致しないフィールドは追跡すべき「参照」として扱われる。
【０１８０】
なお、図６においてフィールド６０３に格納される所定の記号は、オブジェクトにおける全てのフィールドを意味する。
【０１８１】
追跡すべき「参照」が存在しないと判定された場合、計数処理実行部２０７は、ステップＳ３２に戻り、同様の処理を実行する。このとき、計数処理実行部２０７は、探索リストから選択されたオブジェクトを削除する。
【０１８２】
選択されたオブジェクトに追跡すべき「参照」が存在すると判定された場合、計数処理実行部２０７は、探索リストに追加するオブジェクトを探索し（ステップＳ３７）、ステップＳ３２に戻り同様の処理を実行する。
【０１８３】
具体的には、以下のような処理が実行される。
【０１８４】
まず、計数処理実行部２０７は、追跡すべき「参照」によって指定された参照先のオブジェクトのマークビット集合３０４を参照し、選択されたオブジェクトが所属するオブジェクト集合の識別子に対応するマークビットが付与されていない参照先オブジェクトを探索する。
【０１８５】
計数処理実行部２０７は、オブジェクト集合の識別子に対応するマークビットが付与されていない参照先オブジェクトを探索リストに追加する。また、計数処理実行部２０７は、選択されたオブジェクトを探索リストから削除する。
【０１８６】
以上の処理によって、新たに追加されたオブジェクトを基点とした探索処理が可能となる。
【０１８７】
ステップＳ３２において、全てのオブジェクトについて処理が完了したと判定された場合、計数処理実行部２０７は、オブジェクト探索処理を終了して、次の処理を開始する（ステップＳ３８）。
【０１８８】
なお、本実施形態では、モジュールのメモリ使用量を算出する処理について説明したが、本発明はそれに限定されない。例えば、特定のクラスのオブジェクトの数を算出する処理も実行可能である。
【０１８９】
また、本実施形態では、仮想マシン上で実行する構成であったが、オブジェクトのメタ情報及びフィールド情報と同等の情報が得られればよく、仮想マシンを用いない計算機にも適用することができる。
【０１９０】
なお、第一の実施形態では、計数処理実行部２０７がオブジェクト探索処理を実行したが本発明はこれに限定されない。例えば、プログラム実行部２０５がオブジェクト探索処理を実行し、当該処理結果を計数処理実行部２０７に出力してもよい。
【０１９１】
第一の実施形態によれば、参照先オブジェクトを参照する所有オブジェクトを特定することができるため、複数のオブジェクトによって共有されるオブジェクトを含むモジュールが複数あっても、各モジュールに所属するオブジェクトを把握することができる。したがって、モジュール毎のメモリ使用量を正確に算出することができる。
【０１９２】
これによって、アプリケーションを改善してメモリ使用量を削減し、又はメモリリークを起こしているアプリケーションを特定することが可能となる。
【０１９３】
［第二の実施形態］
第二の実施形態では、計算機上で実行されるモジュールのメモリ使用量を算出して、所定のメモリ使用量を超えないように計算機の計算機資源が管理される。以下、第一の実施形態との差異を中心に説明する。
【０１９４】
計算機のハードウェア構成は第一の実施形態と同一であるため説明を省略する。
【０１９５】
図１０は、本発明の第二の実施形態における計算機１００の論理構成の一例を示すブロック図である。
【０１９６】
作業用記憶部２０１、プログラム格納部２０４、プログラム実行部２０５、参照追跡テーブル格納部２０６、計数処理実行部２０７、参照追跡ルール格納部２０８、及びオブジェクト探索ルール格納部２０９は第一の実施形態と同一であるため説明を省略する。
【０１９７】
第二の実施形態では、新たに資源監視部２１０及び資源制限テーブル格納部２１１を備える点が第一の実施形態と異なる。
【０１９８】
資源監視部２１０は、計算機資源の不足が発生した場合に、モジュールの終了処理を実行して計算機資源を確保する。
【０１９９】
資源制限テーブル格納部２１１は、資源制限テーブル１１０１（図１１参照）を格納する。資源制限テーブル１１０１については、図１１を用いて後述する。
【０２００】
図１１は、本発明の第二の実施形態における資源制限テーブル１１００の一例を示す説明図である。
【０２０１】
資源制限テーブル１１０１は、アプリケーション毎の計算機資源の使用量を制限するための情報を格納する。資源制限テーブル１１０１は、モジュール名１１０２及び許容メモリ使用量１１０３を含む。
【０２０２】
モジュール名１１０２は、モジュールを識別する識別子である。許容メモリ使用量１１０３は、モジュール名１１０２に対応するモジュールが使用可能なメモリ使用量である。
【０２０３】
図１２は、本発明の第二の実施形態における資源監視部２１０によって実行される処理を説明するフローチャートである。
【０２０４】
当該処理は、プログラム実行部２０５がオブジェクト生成処理の実行時にヒープメモリ２０２の容量不足を検出した場合に、資源監視部２１０が呼び出された処理を開始する（ステップＳ５１）。
【０２０５】
資源監視部２１０は、資源制限テーブル１１０１のモジュール名１１０２に対応する各モジュールにおけるオブジェクト集合を入力として計数処理実行部２０７に計数処理の実行を依頼する（ステップＳ５２）。
【０２０６】
具体的には、資源監視部２１０は、モジュール名１１０２に対応する各モジュール含むクラスのオブジェクトをヒープメモリ２０２からすべて列挙することによって、各モジュールに対応するオブジェクト集合を取得する。なお、計数処理は第一の実施形態と同一であるため説明を省略する。
【０２０７】
計数処理実行部２０７は、計数処理を実行して、各モジュールのメモリ使用量を算出すし、当該算出結果を資源監視部２１０に出力する。
【０２０８】
算出結果が入力された資源監視部２１０は、資源制限テーブル１１０１を参照して、許容メモリ使用量１１０３の値より大きいメモリ使用量のモジュールを検索する（ステップＳ５３）。
【０２０９】
資源監視部２１０は、許容メモリ使用量１１０３の値より大きいメモリ使用量のモジュールが存在するか否かを判定する（ステップＳ５４）。
【０２１０】
該当するモジュールが存在しないと判定された場合、資源監視部２１０は、オブジェクト生成要求の失敗を示す例外を応答し（ステップＳ５８）、オブジェクト生成処理に戻る（ステップＳ５７）。
【０２１１】
該当するモジュールが存在しないと判定された場合、資源監視部２１０は、該当するモジュールのうち少なくとも１つのモジュールの終了を指示する（ステップＳ５５）。
【０２１２】
なお、本発明は、終了を指示するモジュールの数に限定されず、任意の数のモジュールに対して終了を指示してもよい。例えば、オブジェクトの生成処理の実行に必要なメモリ量を確保できるように必要な数のモジュールを終了させてもよい。
【０２１３】
その後、資源監視部２１０は、終了が指示されたモジュールの終了が完了するまで待機し（ステップＳ５６）、オブジェクト生成処理に戻る（ステップＳ５７）。
【０２１４】
第二の実施形態によれば、アプリケーション毎のメモリ使用量が、予め設定されたモジュール毎のメモリ使用量の上限値を超える場合には、当該モジュールを終了させることによって、特定のアプリケーションの過剰なメモリ確保を防止し、他のアプリケーションの動作に与える悪影響を回避することが可能となる。
【符号の説明】
【０２１５】
１００  計算機
１０１  プロセッサ
１０２  アドレス変換装置
１０３  メモリ
１０４  二次記憶装置
１０５  アドレス／データバス
２０１  作業用記憶部
２０２  ヒープメモリ
２０３  スタック
２０４  プログラム格納部
２０５  プログラム実行部
２０６  参照追跡テーブル格納部
２０７  計数処理実行部
２０８  参照追跡ルール格納部
２０９  オブジェクト探索ルール格納部
２１０  資源監視部
２１１  資源制限テーブル格納部
４０１  参照追跡テーブル
５０１  参照追跡ルールテーブル
６０１  オブジェクト探索ルールテーブル
１１００  資源制限テーブル
１１０１  資源制限テーブル
【図１】
2012221147.tif 000003
【図２】
2012221147.tif 000004
【図３】
2012221147.tif 000005
【図４】
2012221147.tif 000006
【図５】
2012221147.tif 000007
【図６】
2012221147.tif 000008
【図７】
2012221147.tif 000009
【図８】
2012221147.tif 000010
【図９】
2012221147.tif 000011
【図１０】
2012221147.tif 000012
【図１１】
2012221147.tif 000013
【図１２】
2012221147.tif 000014
【図１３Ａ】
2012221147.tif 000015
【図１３Ｂ】
2012221147.tif 000016
【図１４】
2012221147.tif 000017