(57)【特許請求の範囲】
【請求項１】
プログラムを格納するメモリと、前記メモリに格納されたプログラムを所定処理単位毎に実行するプロセッサと、を備え、前記所定処理単位で実行している処理による計算機リソースの使用量を計算する計算機であって、
前記計算機リソースは、当該プログラムの実行時に重複して使用される重複リソースと、当該プログラムの実行時に重複して使用されない非重複リソースとを含むものであり、
前記プロセッサは、
前記所定処理単位で実行している処理による前記計算機リソースの使用量を計算する場合に、前記計算機リソースを解析することによって、前記重複リソースのうちの当該処理によって使用されるリソースと、前記非重複リソースのうちの当該処理によって使用されるリソースとを判定し、
前記判定結果に基づいて、当該処理による前記計算機リソースの使用量を計算することを特徴とする計算機。
【請求項２】
前記プロセッサは、仮想マシン上において、前記メモリに格納されたプログラムをスレッド単位で実行するものであり、
前記計算機リソースは、前記プログラムの実行時に重複して使用される重複オブジェクトが格納されるメモリ領域と、前記プログラムの実行時に重複して使用されない非重複オブジェクトが格納されるメモリ領域とを含む前記メモリであり、
前記プロセッサは、
前記スレッド単位で実行している処理による前記メモリの使用量を計算する場合に、前記メモリに格納された各オブジェクトの参照関係を解析することによって、前記重複オブジェクトのうちの当該処理によって使用されるオブジェクトと、前記非重複オブジェクトのうちの当該処理によって使用されるオブジェクトとを判定し、
前記判定結果に基づいて、当該処理による前記メモリの使用量を計算することを特徴とする請求項１に記載の計算機。
【請求項３】
前記重複オブジェクトは、同一のスレッドにおける異なる複数のスタックフレームが重複して使用しているオブジェクト及び異なる複数のスレッドが重複して使用しているオブジェクトであることを特徴とする請求項２に記載の計算機。
【請求項４】
前記プロセッサは、
各スレッドで実行している処理による前記メモリの使用量を計算し、
計算された前記各スレッドで実行している処理によるメモリ使用量に基づいて、所定のスレッドで実行している処理を取り消し可能か否か判定し、
取り消し可能であると判定された場合に、前記所定のスレッドで実行している処理を取り消すことを特徴とする請求項２に記載の計算機。
【請求項５】
前記プロセッサは、前記判定結果に基づいて、当該処理を終了させた場合の前記メモリの解放量を計算することを特徴とする請求項２に記載の計算機。
【請求項６】
前記プロセッサは、
各スレッドで実行している処理による前記メモリの使用量を計算し、
計算された前記各スレッドで実行している処理によるメモリ使用量を出力するためのデータを生成することを特徴とする請求項２に記載の計算機。
【請求項７】
プログラムを格納するメモリと、前記メモリに格納されたプログラムを所定処理単位毎に実行するプロセッサと、を備えた計算機において、前記所定処理単位で実行している処理による計算機リソースの使用量を計算するリソース使用量計算方法であって、
前記計算機リソースは、当該プログラムの実行時に重複して使用される重複リソースと、当該プログラムの実行時に重複して使用されない非重複リソースとを含むものであり、
前記方法は、
前記プロセッサが、前記所定処理単位で実行している処理による前記計算機リソースの使用量を計算する場合に、前記計算機リソースを解析することによって、前記重複リソースのうちの当該処理によって使用されるリソースと、前記非重複リソースのうちの当該処理によって使用されるリソースとを判定する手順と、
前記プロセッサが、前記判定結果に基づいて、当該処理による前記計算機リソースの使用量を計算する手順と、
を含むことを特徴とするリソース使用量計算方法。
【請求項８】
前記プロセッサは、仮想マシン上において、前記メモリに格納されたプログラムをスレッド単位で実行するものであり、
前記計算機リソースは、前記プログラムの実行時に重複して使用される重複オブジェクトが格納されるメモリ領域と、前記プログラムの実行時に重複して使用されない非重複オブジェクトが格納されるメモリ領域とを含む前記メモリであり、
前記判定する手順において、前記プロセッサは、前記スレッド単位で実行している処理による前記メモリの使用量を計算する場合に、前記メモリに格納された各オブジェクトの参照関係を解析することによって、前記重複オブジェクトのうちの当該処理によって使用されるオブジェクトと、前記非重複オブジェクトのうちの当該処理によって使用されるオブジェクトとを判定し、
前記計算する手順において、前記プロセッサは、前記判定結果に基づいて、当該処理による前記メモリの使用量を計算することを特徴とする請求項７に記載のリソース使用量計算方法。
【請求項９】
前記方法は、さらに、
前記プロセッサが、各スレッドで実行している処理による前記メモリの使用量を計算する手順と、
前記プロセッサが、計算された前記各スレッドで実行している処理によるメモリ使用量に基づいて、所定のスレッドで実行している処理を取り消し可能か否か判定する手順と、
前記プロセッサが、取り消し可能であると判定された場合に、前記所定のスレッドで実行している処理を取り消す手順と、
を含むことを特徴とする請求項８に記載のリソース使用量計算方法。
【請求項１０】
前記方法は、さらに、
前記プロセッサが、前記判定結果に基づいて、当該処理を終了させた場合の前記メモリの解放量を計算する手順を含むことを特徴とする請求項８に記載のリソース使用量計算方法。
【請求項１１】
前記方法は、さらに、
前記プロセッサが、各スレッドで実行している処理による前記メモリの使用量を計算する手順と、
前記プロセッサが、計算された前記各スレッドで実行している処理によるメモリ使用量を出力するためのデータを生成する手順と、
を含むことを特徴とする請求項８に記載のリソース使用量計算方法。
【請求項１２】
プログラムを格納するメモリと、前記メモリに格納されたプログラムを所定処理単位毎に実行するプロセッサと、を備えた計算機において実行され、前記所定処理単位で実行している処理による計算機リソースの使用量を計算するリソース使用量計算プログラムであって、
前記計算機リソースは、当該プログラムの実行時に重複して使用される重複リソースと、当該プログラムの実行時に重複して使用されない非重複リソースとを含むものであり、
前記プログラムは、
前記所定処理単位で実行している処理による前記計算機リソースの使用量を計算する場合に、前記計算機リソースを解析することによって、前記重複リソースのうちの当該処理によって使用されるリソースと、前記非重複リソースのうちの当該処理によって使用されるリソースとを判定する手順と、
前記判定結果に基づいて、当該処理による前記計算機リソースの使用量を計算する手順と、
を前記プロセッサに実行させることを特徴とするリソース使用量計算プログラム。
【請求項１３】
前記プロセッサは、仮想マシン上において、前記メモリに格納されたプログラムをスレッド単位で実行するものであり、
前記計算機リソースは、前記プログラムの実行時に重複して使用される重複オブジェクトが格納されるメモリ領域と、前記プログラムの実行時に重複して使用されない非重複オブジェクトが格納されるメモリ領域とを含む前記メモリであり、
前記プログラムは、
前記スレッド単位で実行している処理による前記メモリの使用量を計算する場合に、前記メモリに格納された各オブジェクトの参照関係を解析することによって、前記重複オブジェクトのうちの当該処理によって使用されるオブジェクトと、前記非重複オブジェクトのうちの当該処理によって使用されるオブジェクトとを判定する手順と、
前記判定結果に基づいて、当該処理による前記メモリの使用量を計算する手順と、
を前記プロセッサに実行させることを特徴とする請求項１２に記載のリソース使用量計算プログラム。
【請求項１４】
前記プログラムは、さらに、
各スレッドで実行している処理による前記メモリの使用量を計算する手順と、
計算された前記各スレッドで実行している処理によるメモリ使用量に基づいて、所定のスレッドで実行している処理を取り消し可能か否か判定する手順と、
取り消し可能であると判定された場合に、前記所定のスレッドで実行している処理を取り消す手順と、
を前記プロセッサに実行させることを特徴とする請求項１３に記載のリソース使用量計算プログラム。
【請求項１５】
前記プログラムは、さらに、前記判定結果に基づいて、当該処理を終了させた場合の前記メモリの解放量を計算する手順を前記プロセッサに実行させることを特徴とする請求項１３に記載のリソース使用量計算プログラム。
【請求項１６】
前記プログラムは、さらに、
各スレッドで実行している処理による前記メモリの使用量を計算する手順と、
計算された前記各スレッドで実行している処理によるメモリ使用量を出力するためのデータを生成する手順と、
を前記プロセッサに実行させることを特徴とする請求項１３に記載のリソース使用量計算プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、計算機、リソース使用量計算方法及びリソース使用量計算プログラムに関する。
【背景技術】
【０００２】
仮想マシン（例えば、ＪａｖａＶＭ）で実行されるプログラム（例えば、Ｊａｖａアプリケーションサーバ）の各処理（例えば、業務アプリケーション）は、スレッド単位で実行される。スレッドが実行される場合には、各スレッドに専用のメモリ領域（スタック領域）と、全てのスレッドで共用のメモリ領域（ヒープ領域）とが必要に応じて使用される。一方、不要なメモリ（オブジェクト）は、仮想マシンのガベージコレクション（以下、「ＧＣ」という。）という機能により、自動的に回収される。【０００３】
スレッドで実行している処理のメモリ使用量に応じて、当該処理を制御する技術が知られている。スレッドで実行している処理とは、スレッド単体で実行している処理や、スレッドにおけるスタックフレーム単位で実行している処理や、複数のスレッドで実行している処理を含む。しかしながら、複数の処理が同じメモリを重複して使用する場合がある。そのため、スレッドで実行される各処理のメモリ使用量を計算することは困難であった。【０００４】
特許文献１には、この問題を解決するための技術が開示されている。特許文献１に開示された技術によれば、スレッドで実行される特定の機能（処理）について、当該特定の機能の実行開始時における仮想マシンのメモリ残量と、当該特定の機能と同時実行されている他の機能とに基づいて、当該特定の機能のメモリ使用量の目安を計算することができる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００９−１１０２１３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、特許文献１に開示されている方法では、特定の処理（例えば上記スレッドで実行している処理）が任意の時点で実際に使用しているリソース量（例えば上記メモリ量）を計算することができないという問題があった。これは、特定の処理だけが使用しているリソース、特定の処理及び他の処理によって重複して使用しているリソース等が不明であるためである。【０００７】
本発明は、上述した課題を考慮したものであって、特定の処理が任意の時点で実際に使用しているリソース量を効率的、かつ、正確に計算することが可能な計算機、リソース使用量計算方法及びリソース使用量計算プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
本願において開示される発明の代表的な一例を示せば以下の通りである。すなわちプログラムを格納するメモリと、前記メモリに格納されたプログラムを所定処理単位毎に実行するプロセッサと、を備え、前記所定処理単位で実行している処理による計算機リソースの使用量を計算する計算機であって、前記計算機リソースは、当該プログラムの実行時に重複して使用される重複リソースと、当該プログラムの実行時に重複して使用されない非重複リソースとを含むものであり、前記プロセッサは、前記所定処理単位で実行している処理による前記計算機リソースの使用量を計算する場合に、前記計算機リソースを解析することによって、前記重複リソースのうちの当該処理によって使用されるリソースと、前記非重複リソースのうちの当該処理によって使用されるリソースとを判定し、前記判定結果に基づいて、当該処理による前記計算機リソースの使用量を計算することを特徴とする。
【発明の効果】
【０００９】
本発明によれば、特定の処理が実際に使用しているリソース量を効率的、かつ、正確に計算することができる。
【図面の簡単な説明】
【００１０】
【図１】本発明の実施の形態のＪａｖaＶＭが動作する計算機システムの構成例を示す図である。
【図２】本発明の実施の形態のメモリ情報テーブルの一例を示す図である。
【図３】本発明の実施の形態のフレーム専有メモリ情報テーブルの一例を示す図である。
【図４】本発明の実施の形態のフレーム共有メモリ情報テーブルの一例を示す図である。
【図５】本発明の実施の形態のスレッド共有メモリ情報テーブルの一例を示す図である。
【図６】本発明の実施の形態のオブジェクトのデータ構造の一例を示す図である。
【図７】本発明の実施の形態のオブジェクト種別とオブジェクト種別ビットとの対応の一例を示す図である
【図８】本発明の実施の形態のメモリ使用量計算処理の手順を示すフローチャートである。
【図９】本発明の実施の形態のオブジェクト解析処理の手順を示すフローチャートである。
【図１０】本発明の実施の形態の必要オブジェクト解析処理の手順を示すフローチャートである。
【図１１】本発明の実施の形態のフレーム共有オブジェクト解析処理の手順を示すフローチャートである。
【図１２】本発明の実施の形態のオブジェクト解析処理中のオブジェクト格納領域の第１例を示す図である。
【図１３】本発明の実施の形態のオブジェクト解析処理中のオブジェクト格納領域の第２例を示す図である。
【図１４】本発明の実施の形態のオブジェクト解析処理中のオブジェクト格納領域の第３例を示す図である。
【図１５】本発明の実施の形態のオブジェクト解析処理中のオブジェクト格納領域の第４例を示す図である。
【図１６】本発明の実施の形態のフレーム専有メモリ使用量計算処理の手順を示すフローチャートである。
【図１７】本発明の実施の形態のフレーム共有メモリ情報ＩＤ登録処理の手順を示すフローチャートである。
【図１８】本発明の実施の形態のスレッド共有メモリ情報ＩＤ登録処理の手順を示すフローチャートである。
【図１９】本発明の実施の形態のフレーム共有メモリ使用量計算処理の手順を示すフローチャートである。
【図２０】本発明の実施の形態のスレッド共有メモリ使用量計算処理の手順を示すフローチャートである。
【図２１】本発明の実施の形態の特定スレッドの総メモリ使用量の計算処理の手順を示すフローチャートである。
【図２２】本発明の実施の形態の参照先フレーム共有メモリ情報ＩＤ展開処理の手順を示すフローチャートである。
【図２３】本発明の実施の形態の参照先スレッド共有メモリ情報ＩＤ展開処理の手順を示すフローチャートである。
【図２４】本発明の実施の形態の展開後のフレーム専有メモリ情報テーブルの一例を示す図である。
【図２５】本発明の実施の形態の特定スレッドの専有メモリ使用量の計算処理の手順を示すフローチャートである。
【図２６】本発明の実施の形態の特定スレッドの共有メモリ使用量の計算処理の手順を示すフローチャートである。
【図２７】本発明の実施の形態の各スレッドの目的別メモリ使用量の一例を示す図である。
【図２８】本発明の実施の形態の複数スレッドを終了させた場合のメモリ解放量の一例を示す図である。
【図２９】本発明の実施の形態のメモリ不足発生時のスレッド制御処理の手順を示すフローチャートである。
【図３０】本発明の実施の形態のメモリ使用量計算結果の出力例を示す図である。
【図３１】本発明の実施の形態のメモリ使用量計算結果の第１の詳細出力例を示す図である。
【図３２】本発明の実施の形態のメモリ使用量計算結果の第２の詳細出力例を示す図である。
【図３３】本発明の実施の形態のメモリ使用量計算結果の第３の詳細出力例を示す図である。
【図３４】本発明の実施の形態のメモリ使用量計算結果の第４の詳細出力例を示す図である。
【図３５】本発明の実施の形態のメモリ使用量計算結果の第５の詳細出力例を示す図である。
【図３６】本発明の実施の形態のメモリ解放量計算結果の出力例を示す図である。
【発明を実施するための形態】
【００１１】
以下、本発明を実施するための形態について図面を参照して説明する。なお、以下の実施の形態では、本発明をＪａｖａＶＭ３２が動作する計算機システム１に適用した場合を例に説明する。
【００１２】
図１は、本発明の実施の形態のＪａｖａＶＭ３２が動作する計算機システム１の構成例を示す図である。図１では、計算機システム１におけるデータの入出力を矢印で示している。
【００１３】
計算機システム１（情報処理装置、計算機）では、ＪａｖａＶＭ３２がＪａｖａクラスファイル４１を実行することによって、所定の業務処理を実行する。すなわちＪａｖａクラスファイル４１は、所定の業務処理を実行するためのプログラムである。このＪａｖａクラスファイル４１は、ＪａｖａＶＭ３２が、インタプリタの実行により解釈及び実行可能な形式であるバイトコードで記述される。また、このＪａｖａクラスファイル４１は、Ｊａｖａ言語によって記述され、ＪａｖａＡＰＩ３１の呼び出しを記述できるＪａｖａソースファイル（不図示）が、Ｊａｖａコンパイラ（不図示）によってコンパイルされることによって生成される。
【００１４】
計算機システム１は、プロセッサ（制御部）２、主記憶装置（記憶部）３、補助記憶装置（記憶部）４、入力装置５及び出力装置６を備える。プロセッサ２、主記憶装置３、補助記憶装置４、入力装置５及び出力装置６は、バス７を介して互いに接続される。
【００１５】
プロセッサ２は、主記憶装置３に記憶された各種プログラムを実行することによって各種処理を実行する。
【００１６】
主記憶装置３は、プログラム、プログラムの実行に必要な情報及びプログラムの処理結果を記憶する。主記憶装置３は、揮発性メモリであってもよいし、不揮発性メモリであってもよい。主記憶装置３は、ＪａｖａＡＰＩ３１、ＪａｖａＶＭ３２、スタック領域３３、データ領域３４及びオペレーティングシステム３５を記憶する。
【００１７】
補助記憶装置４は、Ｊａｖａクラスファイル４１、設定ファイル４２、メモリ情報ファイル４３、コマンド４４を記憶する。Ｊａｖａクラスファイル４１は、業務処理を実行するためのプログラムである。設定ファイル４２は、ＪａｖａＶＭ３２の動作を制御する設定を記録するファイルである。メモリ情報ファイル４３は、メモリ使用量の計算結果を保存するファイルである。コマンド４４は、ＪａｖａＶＭ３２の動作を制御するためのコマンドである。
【００１８】
入力装置５は、計算機システム１に必要な情報を入力するためのインタフェースである。入力装置５は、例えば、キーボード、又は、マウスなどである。
【００１９】
出力装置６は、処理結果などの情報を外部に出力する装置である。出力装置６は、例えば、ディスプレイなどである。
【００２０】
スタック領域３３は、スレッドの実行に必要な情報及びスレッドの処理結果が記憶される領域である。スレッドが生成されると、スレッドに対し固有のスタック領域（例えばスタック領域３３−１）が割り当てられる。
【００２１】
データ領域３４は、プログラムの実行に必要な情報及びプログラムの処理結果が記憶される領域である。データ領域３４は、オブジェクト格納領域３４１及びメモリ情報テーブル３４２を含む。オブジェクト格納領域３４１は、ＪａｖａＶＭ３２によって生成されたオブジェクトを格納する。メモリ情報テーブル３４２は、オブジェクト格納領域３４１に格納されたオブジェクトのメモリ使用量や参照関係に係る情報等を格納する。メモリ情報テーブル３４２の詳細については、図２〜図５を用いて後述する。
【００２２】
ここで、主記憶装置３に記憶される各プログラムについて説明する。
【００２３】
ＪａｖａＡＰＩ（Application Programming Interface）３１は、Ｊａｖａが提供する基本的な機能（例えばライブラリ群）のインタフェースである。このＪａｖａＡＰＩ３１では、例えばメモリ使用量計算部３２４を呼出すためのメソッドが用意される。メソッド実行部３２１は、当該メソッドを実行することによってメモリ使用量計算部３２４を呼出すことができる。
【００２４】
ＪａｖａＶＭ３２は、メソッド実行部３２１、スレッド制御部３２２、ＧＣ実行部３２３、メモリ使用量計算部３２４及びメモリ情報出力部３２５を含む。メソッド実行部３２１、スレッド制御部３２２、ＧＣ実行部３２３、メモリ使用量計算部３２４及びメモリ情報出力部３２５は、プロセッサ２によって実行されるプログラムである。このＪａｖａＶＭ３２は、不要なメモリ領域を動的に解放するメモリ管理機構を備える言語処理実行システムである。
【００２５】
メソッド実行部３２１は、Ｊａｖａクラスファイル４１に記述されたバイトコードの各命令に従い、メソッドをスレッド単位で実行する。命令がオブジェクト生成命令の場合には、オブジェクト格納領域３４１にオブジェクトを生成する。オブジェクト格納領域３４１に空き領域がなく、オブジェクトの生成に失敗した場合には、ＧＣ実行部３２３にＧＣ処理を要求する（ＧＣ処理要求）。ＧＣ実行部３２３は、ＧＣ処理要求を受け付けると、ＧＣ処理を実行し、オブジェクト格納領域３４１において不要なメモリ領域を解放する。その後、メソッド実行部３２１は、再びオブジェクトの生成を実行し、さらに失敗した場合にはメモリ不足エラーを発生させる。
【００２６】
スレッド制御部３２２は、メソッド実行部３２１によって実行されるスレッドの制御を実行する。具体的には、メソッド実行部３２１によって生成されたスレッドに対し、例えばスタック領域３３の割り当てを実行する。
【００２７】
ＧＣ実行部３２３は、メソッド実行部３２１からＧＣ処理要求を受け付けると、オブジェクト格納領域３４１に対しＧＣ処理を実行する。
【００２８】
メモリ使用量計算部３２４は、メモリ情報テーブル３４２を用いて、オブジェクト格納領域３４１におけるメモリ使用量を計算する。このメモリ使用量計算部３２４は、メソッド実行部３２１によって呼び出されても、ＧＣ実行部３２３によって呼び出されてもよい。
【００２９】
メモリ情報出力部３２５は、メモリ使用量計算部３２４による計算結果を例えばディスプレイなどの出力装置６に出力する。また、ログデータとして出力してもよい。
【００３０】
なお、ＪａｖａＶＭ３２は、ＪａｖａＶＭ３２の動作を制御するためのフラグ（以下、「設定フラグ」という。）やパラメータの閾値（以下、「設定閾値」という。）を備える。そして、設定フラグや設定閾値のデフォルト値は、設定ファイル４２、入力装置５及びコマンド４４で指定することによって変更することができる。
【００３１】
また、ＪａｖａＶＭ３２で実行されるメモリ使用量計算部３２４やメモリ情報出力部３２５の機能を備えたプログラムは、ＵＳＢ（Universal Serial Bus）メモリ、ＳＤメモリカード等の記録媒体に記録されてもよい。
【００３２】
図２は、本発明の実施の形態のメモリ情報テーブル３４２の一例を示す図である。
【００３３】
メモリ情報テーブル３４２は、フレーム専有メモリ情報テーブル３４２ａ、フレーム共有メモリ情報テーブル３４２ｂ及びスレッド共有メモリ情報テーブル３４２ｃを含む。フレーム専有メモリ情報テーブル３４２ａ、フレーム共有メモリ情報テーブル３４２ｂ及びスレッド共有メモリ情報テーブル３４２ｃの詳細は、それぞれ、図３、図４及び図５で説明する。
【００３４】
図３は、本発明の実施の形態のフレーム専有メモリ情報テーブル３４２ａの一例を示す図である。
【００３５】
フレーム専有メモリ情報テーブル３４２ａの各エントリ（以下、「フレーム専有メモリ情報」という。）は、フレーム専有メモリ情報ＩＤ３０１、スレッドＩＤ３０２、メソッド名３０３、フレーム専有メモリ使用量３０４、参照先フレーム共有メモリ情報ＩＤ３０５及び参照先スレッド共有メモリ情報ＩＤ３０６を含む。
【００３６】
フレーム専有メモリ情報とは、スレッドＩＤ３０２で識別されるスレッドにおいて、メソッド名３０３で識別されるメソッドに係るスタックフレームが専有で使用しているメモリ、すなわちスレッドで実行している各処理が専有で使用しているフレーム専有メモリに関する情報である。
【００３７】
フレーム専有メモリ情報ＩＤ３０１は、フレーム専有メモリ情報毎に割当てられ、各フレーム専有メモリ情報を識別するための一意の値（識別子）である。
【００３８】
スレッドＩＤ３０２は、スレッドを識別するための識別子である。
【００３９】
メソッド名３０３は、スタックフレームを識別するための情報である。なお、スタックフレームを識別するための情報であれば、メソッド名３０３に限定されるものではない。メソッド名３０３にパッケージ名やクラス名を付加することによって、識別性を高めてもよい。また、スタックフレームを識別するための情報は、スタックフレームのＩＤでもよい。本発明の実施の形態では、便宜上、スタックフレームを識別するための情報として、メソッド名３０３を使用する。
【００４０】
フレーム専有メモリ使用量３０４は、スレッドＩＤ３０２及びメソッド名３０３で識別されるスタックフレームが専有で使用しているメモリ、すなわちフレーム専有メモリの使用量である。
【００４１】
参照先フレーム共有メモリ情報ＩＤ３０５は、フレーム専有メモリ情報が参照しているフレーム共有メモリ情報（図４参照）のフレーム共有メモリ情報ＩＤ４０１である。
【００４２】
参照先スレッド共有メモリ情報ＩＤ３０６は、フレーム専有メモリ情報が参照しているスレッド共有メモリ情報（図５参照）のスレッド共有メモリ情報ＩＤ５０１である。
【００４３】
図４は、本発明の実施の形態のフレーム共有メモリ情報テーブル３４２ｂの一例を示す図である。
【００４４】
フレーム共有メモリ情報テーブル３４２ｂの各エントリ（以下、「フレーム共有メモリ情報」という。）は、フレーム共有メモリ情報ＩＤ４０１、アドレス４０２、クラス名４０３、フレーム共有メモリ使用量４０４、参照先フレーム共有メモリ情報ＩＤ４０５及び参照先スレッド共有メモリ情報ＩＤ４０６を含む。
【００４５】
フレーム共有メモリ情報とは、同じスレッドにおける異なるスタックフレームが共有で使用しているメモリ、すなわち同じスレッドで実行している異なる複数の処理が共有で使用しているフレーム共有メモリに関する情報である。
【００４６】
フレーム共有メモリ情報ＩＤ４０１は、フレーム共有メモリ情報毎に割当てられ、各フレーム共有メモリ情報を識別するための一意の値（識別子）である。
【００４７】
アドレス４０２は、フレーム共有メモリに含まれるオブジェクトにおいて参照関係のルートであるオブジェクトのアドレスである。
【００４８】
クラス名４０３は、フレーム共有メモリに含まれるオブジェクトにおいて参照関係のルートであるオブジェクトのクラス名である。なお、クラス名４０３にパッケージ名を付加することによって、識別性を高めてもよい。また、クラス名４０３は、アドレス４０２によって指定されるオブジェクトから取得可能であるため、省略してもよい。本発明の実施の形態の説明では、便宜上、クラス名４０３を省略しない。
【００４９】
フレーム共有メモリ使用量４０４は、同じスレッドにおける異なるスタックフレームが共有で使用しているメモリ、すなわちフレーム共有メモリの使用量である。
【００５０】
参照先フレーム共有メモリ情報ＩＤ４０５は、フレーム共有メモリ情報が参照しているフレーム共有メモリ情報のフレーム共有メモリ情報ＩＤ４０１である。
【００５１】
参照先スレッド共有メモリ情報ＩＤ４０６は、フレーム共有メモリ情報が参照しているスレッド共有メモリ情報（図５参照）のスレッド共有メモリ情報ＩＤ５０１である。
【００５２】
図５は、本発明の実施の形態のスレッド共有メモリ情報テーブル３４２ｃの一例を示す図である。
【００５３】
スレッド共有メモリ情報テーブル３４２ｃの各エントリ（以下、「スレッド共有メモリ情報」という。）は、スレッド共有メモリ情報ＩＤ５０１、アドレス５０２、クラス名５０３、スレッド共有メモリ使用量５０４、参照先フレーム共有メモリ情報ＩＤ５０５及び参照先スレッド共有メモリ情報ＩＤ５０６を含む。
【００５４】
スレッド共有メモリ情報とは、異なる複数のスレッドが共有で使用しているメモリ、すなわちスレッド共有メモリに関する情報である。
【００５５】
スレッド共有メモリ情報ＩＤ５０１は、スレッド共有メモリ情報毎に割当てられ、各スレッド共有メモリ情報を識別するための一意の値（識別子）である。
【００５６】
アドレス５０２は、スレッド共有メモリに含まれるオブジェクトにおいて参照関係のルートであるオブジェクトのアドレスである。
【００５７】
クラス名５０３は、スレッド共有メモリに含まれるオブジェクトにおいて参照関係のルートであるオブジェクトのクラス名である。なお、クラス名５０３にパッケージ名を付加することによって、識別性を高めてもよい。また、アドレス５０２によって指定されるオブジェクトからクラス名５０３を取得できるため、クラス名５０３は省略してもよい。本発明の実施の形態の説明では、便宜上、クラス名５０３を省略していない。
【００５８】
スレッド共有メモリ使用量５０４は、異なる複数のスレッドが共有で使用しているメモリ、すなわちスレッド共有メモリの使用量である。
【００５９】
参照先フレーム共有メモリ情報ＩＤ５０５は、スレッド共有メモリ情報が参照しているフレーム共有メモリ情報（図４参照）のフレーム共有メモリ情報ＩＤ４０１である。
【００６０】
参照先スレッド共有メモリ情報ＩＤ５０６は、スレッド共有メモリ情報が参照しているスレッド共有メモリ情報のスレッド共有メモリ情報ＩＤ５０１である。
【００６１】
図６は、本発明の実施の形態のオブジェクト６０１のデータ構造の一例を示す図である。
【００６２】
ここでは、オブジェクト格納領域３４１（図１参照）に格納されるオブジェクト６０１のデータ構造の一例を説明する。オブジェクト６０１は、オブジェクトヘッダ６０２と、オブジェクトデータ６０３とを含む。
【００６３】
オブジェクトヘッダ６０２は、オブジェクト６０１の管理情報である。本発明の実施の形態では、オブジェクトヘッダ６０２には、オブジェクト６０１の種別（"未解析"、"必要"、"フレーム共有"、"スタック共有"のいずれか）を示す情報（例えば図７のオブジェクト種別ビット）が格納される。なお、オブジェクト６０１の種別を示す情報は、オブジェクトデータ６０３に格納されてもよいし、オブジェクトヘッダ６０２及びオブジェクトデータ６０３以外の領域に格納されてもよい。オブジェクトデータ６０３は、オブジェクト６０１のデータ本体である。
【００６４】
図７は、本発明の実施の形態のオブジェクト種別とオブジェクト種別ビットとの対応の一例を示す図である。
【００６５】
図７のオブジェクト種別テーブル７０１に示すように、オブジェクト種別毎に、オブジェクト種別ビット（ここでは２ビットの値）が対応付けられている。本発明の実施の形態では、オブジェクトヘッダ６０２（図６参照）に格納された２ビットの値が、オブジェクト種別ビットとして使用される。
【００６６】
具体的には、オブジェクト種別ビットが"００"の場合には、オブジェクト種別が"未解析"、すなわち当該オブジェクトはオブジェクト解析処理（図９参照）において、未解析のオブジェクトであることを示す。
【００６７】
また、オブジェクト種別ビットが"０１"の場合には、オブジェクト種別が"必要"、すなわち当該オブジェクトはオブジェクト解析処理において、プログラムの実行に必要なオブジェクトであると判定済みであることを示す。
【００６８】
同様に、オブジェクト種別ビットが"１０"の場合には、オブジェクト種別が"フレーム共有"、すなわち当該オブジェクトはオブジェクト解析処理において、同じスレッドにおける複数の異なるスタックフレームから参照されているオブジェクトであると判定済みであることを示す。
【００６９】
さらに、オブジェクト種別ビットが"１１"の場合には、オブジェクト種別が"スレッド共有"、すなわち当該オブジェクトは、オブジェクト解析処理において、異なる複数のスレッドから参照されているオブジェクトであると判定済みであることを示す。
【００７０】
［メモリ使用量計算処理］
【００７１】
図８は、本発明の実施の形態のメモリ使用量計算処理の手順を示すフローチャートである。メモリ使用量計算部３２４は、本処理を実行することによって、スレッドで実行している処理のメモリ使用量を計算する。スレッドで実行している処理とは、スレッド単体で実行している処理や、スレッド中のスタックフレーム単位で実行している処理や、複数のスレッドで実行している処理を含む。
【００７２】
まずステップ８０１において、メモリ使用量計算部３２４は、スレッド制御部３２２に、当該メモリ使用量計算処理を実行するスレッド以外の全スレッドの停止を要求する（Ｓ８０１）。スレッド制御部３２２は、当該要求に応じてスレッドを停止する。
【００７３】
次にステップ８０２において、メモリ使用量計算部３２４は、オブジェクト解析処理を実行する（Ｓ８０２）。これにより、オブジェクト格納領域３４１内の各オブジェクトの種別を特定する。オブジェクト解析処理の詳細については、図９を参照して後述する。
【００７４】
次にステップ８０３において、メモリ使用量計算部３２４は、未処理のスタックフレームの各々について、ステップ８０４及びステップ８０５の処理を実行する。すなわち全てのスタックフレームについて、ステップ８０４及びステップ８０５の処理を実行する。
【００７５】
ステップ８０４では、メモリ使用量計算部３２４は、未処理のスタックフレームに対応するフレーム専有メモリ情報を、フレーム専有メモリ情報テーブル３４２ａに登録する（Ｓ８０４）。具体的には、フレーム専有メモリ情報ＩＤ３０１、スレッドＩＤ３０２、メソッド名３０３及びフレーム専有メモリ使用量（初期値は０）３０４を登録する。
【００７６】
ステップ８０５では、メモリ使用量計算部３２４は、未処理のスタックフレームのフレーム専有メモリ使用量３０４を計算する（Ｓ８０５）。具体的には、当該未処理のスタックフレーム内のオブジェクト参照を再帰的に辿りながら、当該未処理のスタックフレームのフレーム専有メモリ使用量３０４を計算する。フレーム専有メモリ使用量３０４の計算処理の詳細については、図１６を参照して後述する。
【００７７】
以上のステップ８０３〜８０５の処理により、メモリ使用量計算部３２４は、フレーム専有メモリ情報テーブル３４２ａ（図３参照）に、全てのスタックフレームに対応するフレーム専有メモリ情報を登録する。
【００７８】
その後ステップ８０６では、メモリ使用量計算部３２４は、未処理のフレーム共有メモリ情報と未処理のスレッド共有メモリ情報の各々について、ステップ８０７及びステップ８０８の処理を実行する。すなわち全てのフレーム共有メモリ情報と全てのスレッド共有メモリ情報について、ステップ８０７及びステップ８０８の処理を実行する。
【００７９】
ステップ８０７では、メモリ使用量計算部３２４は、未処理のフレーム共有メモリ情報のフレーム共有メモリ使用量計算処理を実行する（Ｓ８０７）。具体的には、当該未処理のフレーム共有メモリ情報のアドレス４０２が指し示す参照先オブジェクトのメモリ使用量を、当該未処理のフレーム共有メモリ情報のフレーム共有メモリ使用量４０４に加算する。その後、処理対象を参照先オブジェクトに移動（変更）し、オブジェクト参照を図１９に示す手順で再帰的に辿りながら、当該未処理のフレーム共有メモリ情報のフレーム共有メモリ使用量４０４を計算する。フレーム共有メモリ使用量計算処理の詳細については、図１９を参照して後述する。
【００８０】
ステップ８０８では、メモリ使用量計算部３２４は、未処理のスレッド共有メモリ情報のスレッド共有メモリ使用量計算処理を実行する（Ｓ８０８）。具体的には、当該未処理のスレッド共有メモリ情報のアドレス５０２が指し示す参照先オブジェクトのメモリ使用量を、当該未処理のスレッド共有メモリ情報のスレッド共有メモリ使用量５０４に加算する。その後、処理対象を参照先オブジェクトに移動し、オブジェクト参照を図２０に示す手順で再帰的に辿りながら、当該未処理のスレッド共有メモリ情報のスレッド共有メモリ使用量５０４を計算する。スレッド共有メモリ使用量計算処理の詳細については、図２０を参照して後述する。
【００８１】
以上に示すステップ８０６〜８０８の処理により、メモリ使用量計算部３２４は、フレーム共有メモリ情報テーブル３４２ｂ（図４参照）に、全てのフレーム共有メモリ情報を登録する。また、スレッド共有メモリ情報テーブル３４２ｃ（図５参照）に、全てのスレッド共有メモリ情報を登録する。
【００８２】
その後ステップ８０９において、メモリ使用量計算部３２４は、スレッド制御部３２２にスレッドの再開を要求し、ステップ８０１で停止された全スレッドを再開させる（Ｓ８０９）。
【００８３】
その後ステップ８１０において、メモリ使用量計算部３２４は、目的別メモリ使用量計算処理を実行することによって、目的に応じたメモリ使用量を計算する（Ｓ８１０）。目的別メモリ使用量計算処理の詳細については、図２１〜２８を参照して後述する。
【００８４】
以上に示す処理により、メモリ使用量計算部３２４は、スレッドで実行している処理のメモリ使用量を計算することができる。なお、ステップ８１０の処理を、ステップＳ８０９の処理より前に実行してもよい。また、ステップ８１０の処理では、メモリ使用量のみならず、１以上のスレッドを終了させた場合のメモリ解放量を計算してもよい。
【００８５】
［オブジェクト解析処理］
【００８６】
図９は、本発明の実施の形態のオブジェクト解析処理の手順を示すフローチャートである。メモリ使用量計算部３２４は、本処理を実行することによって、オブジェクト格納領域３４１内の各オブジェクトの種別を特定する。
【００８７】
なお、当該オブジェクト解析処理の実行前に、メモリ使用量計算部３２４は、オブジェクト格納領域３４１に格納された全オブジェクトのオブジェクトヘッダ６０２に、オブジェクト種別"未解析"を設定する（初期化処理）。
【００８８】
まずステップ９０１において、メモリ使用量計算部３２４は、未処理のオブジェクト参照について、ステップ９０２〜９０７の処理を実行する。すなわち全てのスレッドにおける全てのスタックフレーム内のオブジェクト参照について、ステップ９０２〜９０７の処理を実行する。
【００８９】
ステップ９０２では、メモリ使用量計算部３２４は、参照先オブジェクトのオブジェクト種別を判定する（Ｓ９０２）。
【００９０】
参照先オブジェクトのオブジェクト種別が"未解析"の場合は、メモリ使用量計算部３２４は、参照先オブジェクトのオブジェクト種別を"必要"に設定する（Ｓ９０３）。その後、処理対象を参照先オブジェクトに移動し（Ｓ９０４）、当該参照先オブジェクトに対して当該オブジェクト解析処理（図９）を再帰的に実行する（Ｓ９０５）。
【００９１】
また、参照先オブジェクトのオブジェクト種別が"必要"の場合は、メモリ使用量計算部３２４は、必要オブジェクト解析処理を実行する（Ｓ９０６）。オブジェクト種別を"フレーム共有"又は"スレッド共有"に変更すべきか否かを解析するためである。その後、ステップ９０１に戻って、処理対象を当該オブジェクト参照とは別の未処理のオブジェクト参照に移動する。なお、必要オブジェクト解析処理の詳細については、図１０を参照して後述する。
【００９２】
また、参照先オブジェクトのオブジェクト種別が"フレーム共有"の場合は、メモリ使用量計算部３２４は、フレーム共有オブジェクト解析処理を実行する（Ｓ９０７）。オブジェクト種別を"スレッド共有"に変更すべきか否かを解析するためである。その後、ステップ９０１に戻って、処理対象を当該オブジェクト参照とは別の未処理のオブジェクト参照に移動する。なお、フレーム共有オブジェクト解析処理の詳細については、図１１を参照して後述する。
【００９３】
また、参照先オブジェクトのオブジェクト種別が"スレッド共有"の場合は、オブジェクト種別は変更されない。そのため、メモリ使用量計算部３２４は、処理を実行せずに、ステップＳ９０１に戻って、処理対象を当該オブジェクト参照とは別の未処理のオブジェクト参照に移動する。
【００９４】
以上に示す処理により、メモリ使用量計算部３２４は、全スレッドにおける全スタックフレーム内の全オブジェクト参照について、当該オブジェクト参照を再帰的に辿りながら、参照先オブジェクトにオブジェクト種別を特定（設定）する。
【００９５】
図１０は、本発明の実施の形態の必要オブジェクト解析処理の手順を示すフローチャートである。図９のステップ９０６において、メモリ使用量計算部３２４は本処理を実行する。
【００９６】
まずステップ１００１において、メモリ使用量計算部３２４は、処理対象の参照先オブジェクトが、どのスタックフレームから辿り済みのオブジェクトであるかを判定する（Ｓ１００１）。すなわち現在のオブジェクト解析処理を実行時の辿り元（参照元）のスタックフレームと、過去にオブジェクト解析処理を実行時の辿り元のスタックフレームとを比較する。
【００９７】
同じスタックフレームから辿り済みのオブジェクトの場合は、メモリ使用量計算部３２４は、参照先オブジェクトのオブジェクト種別を変更しない。
【００９８】
同じスレッドにおける異なるスタックフレームから辿り済みのオブジェクトの場合は、メモリ使用量計算部３２４は、参照先オブジェクトのオブジェクト種別を"フレーム共有"に設定（変更）する（Ｓ１００２）。
【００９９】
異なるスレッドのスタックフレームから辿り済みのオブジェクトの場合は、メモリ使用量計算部３２４は、参照先オブジェクトのオブジェクト種別を"スレッド共有"に設定する（Ｓ１００３）。
【０１００】
以上に示す処理により、メモリ使用量計算部３２４は、参照先オブジェクトのオブジェクト種別が"必要"の場合に、当該参照先オブジェクトがどのスタックフレームから辿り済みのオブジェクトであるかに応じて、当該参照先オブジェクトのオブジェクト種別を設定（変更）する。
【０１０１】
図１１は、本発明の実施の形態のフレーム共有オブジェクト解析処理の手順を示すフローチャートである。図９のステップ９０７において、メモリ使用量計算部３２４は本処理を実行する。
【０１０２】
まずステップ１１０１において、メモリ使用量計算部３２４は、処理対象の参照先オブジェクトが、どのスタックフレームから辿り済みのオブジェクトであるかを判定する（Ｓ１１０１）。すなわち現在のオブジェクト解析処理を実行時の辿り元（参照元）のスタックフレームと、過去にオブジェクト解析処理を実行時の辿り元のスタックフレームとを比較する。
【０１０３】
同じスタックフレームから辿り済みのオブジェクトの場合及び同じスレッドの異なるスタックフレームから辿り済みのオブジェクトの場合は、メモリ使用量計算部３２４は、参照先オブジェクトのオブジェクト種別を変更しない。
【０１０４】
異なるスレッドのスタックフレームから辿り済みのオブジェクトの場合は、メモリ使用量計算部３２４は、参照先オブジェクトのオブジェクト種別を"スレッド共有"に設定（変更）する（Ｓ１１０２）。
【０１０５】
以上に示す処理により、メモリ使用量計算部３２４は、参照先オブジェクトのオブジェクト種別が"フレーム共有"の場合に、当該参照先オブジェクトがどのスタックフレームから辿り済みのオブジェクトであるかに応じて、当該参照先オブジェクトのオブジェクト種別を設定（変更）する。
【０１０６】
［オブジェクト解析処理中の各オブジェクトのオブジェクト種別］
【０１０７】
続いて、図９に示すオブジェクト解析処理中のオブジェクト格納領域３４１に格納された各オブジェクトに設定されるオブジェクト種別の変化の様子について説明する。
【０１０８】
図１２は、本発明の実施の形態のオブジェクト解析処理中のオブジェクト格納領域３４１の第１例を示す図である。図１２では、Ｃｌａｓｓ１．ｍｅｔｈｏｄＡを実行中のスタックフレームについてのオブジェクト解析処理が完了したときに、各オブジェクトに設定されるオブジェクト種別を示している。
【０１０９】
図１３は、本発明の実施の形態のオブジェクト解析処理中のオブジェクト格納領域３４１の第２例を示す図である。図１３では、Ｃｌａｓｓ１．ｍｅｔｈｏｄＢを実行中のスタックフレームまでのオブジェクト解析処理が完了したときに、各オブジェクトに設定されるオブジェクト種別を示している。
【０１１０】
図１４は、本発明の実施の形態のオブジェクト解析処理中のオブジェクト格納領域３４１の第３例を示す図である。図１４では、Ｃｌａｓｓ２．ｍｅｔｈｏｄＣを実行中のスタックフレームまでのオブジェクト解析処理が完了したときに、各オブジェクトに設定されるオブジェクト種別を示している。
【０１１１】
図１５は、本発明の実施の形態のオブジェクト解析処理中のオブジェクト格納領域３４１の第４例を示す図である。図１５では、全スタックフレームについてオブジェクト解析処理が完了したときに、各オブジェクトに設定されるオブジェクト種別を示している。
【０１１２】
なお、図１２〜１５において、各オブジェクトは丸印で示されている。丸印の内部に文字が付されていないオブジェクトの種別は"未解析"である。Ｎの文字が付されているオブジェクトの種別は"必要"である。また、Ｆの文字が付されているオブジェクトの種別は"フレーム共有"である。Ｔの文字が付されているオブジェクトの種別は"スレッド共有"である。
【０１１３】
また、オブジェクトの右上に付された＃Ｆで始まる文字は、フレーム共有メモリ情報ＩＤ４０１（図４参照）を示す。また、＃Ｔで始まる文字は、スレッド共有メモリ情報ＩＤ５０１（図５参照）を示す。さらに、オブジェクトの右下に付された数字は、当該オブジェクトのメモリ使用量を示す。
【０１１４】
また、二重線の枠で示すスタックフレーム（例えば、Ｃｌａｓｓ２．ｍｅｔｈｏｄＥ）は、固定スタックフレーム（例えば、システムプログラム）である。一方、その他のスタックフレーム（例えば、Ｃｌａｓｓ１．ｍｅｔｈｏｄＡ）は、変動スタックフレーム（例えばユーザプログラム）である。すなわちスタックフレームは、固定スタックフレーム及び変動スタックフレームを含んでもよい。また、スタックフレームの種別は、図２９を用いて後述するスレッド制御処理のキャンセル実行条件の判定(Ｓ２９０４)等、選択や判定の条件に使用してもより(例えば、変動スタックフレームで発生したメモリ不足の場合に制御対象スレッドをキャンセルすること等。)。
【０１１５】
そうすると、図１５に示すように、オブジェクト格納領域３４１内の各オブジェクトは、スレッド単位（ここではスレッド１〜Ｎ）で実行されるプログラムにおいて、重複して使用されるＦ又はＴの文字が付されているオブジェクト（重複オブジェクト、重複リソース）と、原則的に重複して使用されないＮの文字が付されているオブジェクト（非重複オブジェクト、非重複リソース）と、その他のオブジェクトとに分けられる。また、重複オブジェクトは、Ｆの文字が付されているオブジェクト（同じスレッドで実行している異なる複数の処理が共有で使用しているオブジェクト）と、Ｔの文字が付されているオブジェクト（異なる複数のスレッドが共有で使用しているオブジェクト）とを含む。
【０１１６】
また、図１５に示す各オブジェクトの種別に基づいて、図８のステップ８０３〜８０８の処理が実行されると、図３のフレーム専有メモリ情報テーブル３４２ａ、図４のフレーム共有メモリ情報テーブル３４２ｂ及び図５のスレッド共有メモリ情報テーブル３４２ｃが生成される。
【０１１７】
図１６は、本発明の実施の形態のフレーム専有メモリ使用量計算処理の手順を示すフローチャートである。図８のステップ８０５において、メモリ使用量計算部３２４は本処理を実行することによって、所定スタックフレーム（以下、本処理の説明において、「スタックフレームＳ」という。）のフレーム専有メモリ使用量を計算する。
【０１１８】
まずステップ１６０１において、メモリ使用量計算部３２４は、未処理の参照先オブジェクトについて、ステップ１６０２〜１６０７の処理を実行する。すなわちスタックフレームＳの全ての参照先オブジェクトについて、ステップ１６０２〜１６０７の処理を実行する。
【０１１９】
ステップ１６０２では、メモリ使用量計算部３２４は、未処理の参照先オブジェクトのオブジェクト種別を判定する（Ｓ１６０２）。
【０１２０】
未処理の参照先オブジェクトのオブジェクト種別が"必要"の場合は、未処理の参照先オブジェクトが使用しているメモリは、スタックフレームＳの専有メモリである。そのため、メモリ使用量計算部３２４は、当該未処理の参照先オブジェクトのメモリ使用量を、フレーム専有メモリ情報テーブル３４２ａに格納されているスタックフレームＳに対応するフレーム専有メモリ情報のフレーム専有メモリ使用量３０４に加算する（Ｓ１６０３）。その後、処理対象を当該未処理の参照先オブジェクトの参照先オブジェクトに移動する（Ｓ１６０４）。その後、移動後の参照先オブジェクトに対して、当該フレーム専有メモリ使用量計算処理（図１６）を再帰的に実行する（Ｓ１６０５）。
【０１２１】
未処理の参照先オブジェクトのオブジェクト種別が"フレーム共有"の場合は、当該未処理の参照先オブジェクトが使用しているメモリは、スタックフレームＳと他のスタックフレームとの共有メモリ、すなわちフレーム共有メモリである。そのため、メモリ使用量計算部３２４は、（フレーム専有メモリ情報テーブル３４２ａを登録対象とした）フレーム共有メモリ情報ＩＤ登録処理を実行する（Ｓ１６０６）。その後、ステップ１６０１に戻って、処理対象を当該未処理の参照先オブジェクトとは別の未処理の参照先オブジェクトに移動する。フレーム共有メモリ情報ＩＤ登録処理の詳細については、図１７を参照して後述する。
【０１２２】
未処理の参照先オブジェクトのオブジェクト種別が"スレッド共有"の場合は、当該未処理の参照先オブジェクトが使用しているメモリは、スタックフレームＳに係るスレッドと他のスレッドとの共有メモリ、すなわちスレッド共有メモリである。そのため、メモリ使用量計算部３２４は、（フレーム専有メモリ情報テーブル３４２ａを登録対象とした）スレッド共有メモリ情報ＩＤ登録処理を実行する（Ｓ１６０７）。その後、ステップ１６０１に戻って、処理対象を当該未処理の参照先オブジェクトとは別の未処理の参照先オブジェクトに移動する。スレッド共有メモリ情報ＩＤ登録処理の詳細については、図１８を参照して後述する。
【０１２３】
以上に示す処理により、メモリ使用量計算部３２４は、スタックフレームＳ内のオブジェクト参照を再帰的に辿りながら、スタックフレームＳのフレーム専有メモリ使用量３０４を計算する。
【０１２４】
例えば図１５において、スレッド１のＣｌａｓｓ１．ｍｅｔｈｏｄＢで示されるスタックフレームのフレーム専有メモリ使用量は、オブジェクト種別が"必要"である参照先オブジェクト、すなわち当該スタックフレームの参照先オブジェクトのメモリ使用量"１２"と、当該参照先オブジェクトの参照先オブジェクトのメモリ使用量"２４"とを加算した"３６"となる。
【０１２５】
図１７は、本発明の実施の形態のフレーム共有メモリ情報ＩＤ登録処理の手順を示すフローチャートである。
【０１２６】
メモリ使用量計算部３２４は、本処理を実行することによって、登録対象のテーブルに、オブジェクトの種別が"フレーム共有"である参照先オブジェクト（以下、本処理の説明において、「参照先オブジェクトＦＯ」という。）のフレーム共有メモリ情報ＩＤを登録する。登録対象のテーブルとは、フレーム専有メモリ情報テーブル３４２ａ、フレーム共有メモリ情報テーブル３４２ｂ、スレッド共有メモリ情報テーブル３４２ｃのいずれかである。
【０１２７】
まずステップ１７０１において、メモリ使用量計算部３２４は、フレーム共有メモリ情報テーブル３４２ｂにおいて、参照先オブジェクトＦＯに対応するフレーム共有メモリ情報が登録済みか否か判定する（Ｓ１７０１）。具体的には、参照先オブジェクトＦＯの参照関係のルートであるオブジェクトのアドレスと、フレーム共有メモリ情報テーブル３４２ｂに登録された各フレーム共有メモリ情報のアドレス４０２との比較によって、上記判定を実行する。登録済みである場合には（Ｓ１７０１でＹＥＳ）、ステップ１７０３に進む。
【０１２８】
一方、未登録である場合には（Ｓ１７０１でＮＯ）、メモリ使用量計算部３２４は、参照先オブジェクトＦＯに対応するフレーム共有メモリ情報を、フレーム共有メモリ情報テーブル３４２ｂに登録する（Ｓ１７０２）。具体的には、フレーム共有メモリ情報ＩＤ４０１、アドレス４０２、クラス名４０３及びフレーム共有メモリ使用量４０４（初期値は０）を登録する。
【０１２９】
ステップ１７０３では、メモリ使用量計算部３２４は、参照先オブジェクトＦＯに対応するフレーム共有メモリ情報のフレーム共有メモリ情報ＩＤ４０１を、登録対象のテーブルの参照先フレーム共有メモリ情報ＩＤに設定（登録）する（Ｓ１７０３）。
【０１３０】
ステップ１７０３において、具体的には、まずフレーム共有メモリ情報テーブル３４２ｂから、参照先オブジェクトＦＯに対応するフレーム共有メモリ情報のフレーム共有メモリ情報ＩＤ４０１を取得する。その後、取得されたフレーム共有メモリ情報ＩＤ４０１を、登録対象のテーブルの参照先フレーム共有メモリ情報ＩＤに設定する。
【０１３１】
すなわち図１６のステップ１６０６のように、登録対象のテーブルがフレーム専有メモリ情報テーブル３４２ａの場合は、フレーム専有メモリ情報テーブル３４２ａに格納されているスタックフレームＳに対応するフレーム専有メモリ情報の参照先フレーム共有メモリ情報ＩＤ３０５に設定する。また、図１９のステップ１９０７のように、登録対象のテーブルがフレーム共有メモリ情報テーブル３４２ｂの場合は、フレーム共有メモリ情報Ｆの参照先フレーム共有メモリ情報ＩＤ４０５に設定する。さらに、図２０のステップ２００７のように、登録対象のテーブルがスレッド共有メモリ情報テーブル３４２ｃの場合は、スレッド共有メモリ情報Ｔの参照先フレーム共有メモリ情報ＩＤ５０５に設定する。
【０１３２】
以上に示す処理により、メモリ使用量計算部３２４は、登録対象のテーブルに、フレーム共有メモリを使用している参照先オブジェクトＦＯのフレーム共有メモリ情報ＩＤを登録する。
【０１３３】
図１８は、本発明の実施の形態のスレッド共有メモリ情報ＩＤ登録処理の手順を示すフローチャートである。
【０１３４】
メモリ使用量計算部３２４は、本処理を実行することによって、登録対象のテーブルに、オブジェクトの種別が"スレッド共有"である参照先オブジェクト（以下、本処理の説明において、「参照先オブジェクトＳＯ」とする。）のスレッド共有メモリ情報ＩＤを登録する。登録対象のテーブルとは、フレーム専有メモリ情報テーブル３４２ａ、フレーム共有メモリ情報テーブル３４２ｂ、スレッド共有メモリ情報テーブル３４２ｃのいずれかである。
【０１３５】
まずステップ１８０１において、メモリ使用量計算部３２４は、スレッド共有メモリ情報テーブル３４２ｃにおいて、参照先オブジェクトＳＯに対応するスレッド共有メモリ情報が登録済みか否か判定する（Ｓ１８０１）。具体的には、参照先オブジェクトＳＯの参照関係のルートであるオブジェクトのアドレスと、スレッド共有メモリ情報テーブル３４２ｃに登録された各スレッド共有メモリ情報のアドレス５０２との比較によって、上記判定を実行する。登録済みである場合には（Ｓ１８０１でＹＥＳ）、ステップ１８０３に進む。
【０１３６】
一方、未登録である場合には（Ｓ１８０１でＮＯ）、メモリ使用量計算部３２４は、参照先オブジェクトＳＯに対応するスレッド共有メモリ情報を、スレッド共有メモリ情報テーブル３４２ｃに登録する（Ｓ１８０２）。具体的には、スレッド共有メモリ情報ＩＤ５０１、アドレス５０２、クラス名５０３及びスレッド共有メモリ使用量５０４（初期値は０）を登録する。
【０１３７】
ステップ１８０３では、メモリ使用量計算部３２４は、参照先オブジェクトＳＯに対応するスレッド共有メモリ情報のスレッド共有メモリ情報ＩＤ５０１を、登録対象の参照先スレッド共有メモリ情報ＩＤに設定（登録）する（Ｓ１８０３）。
【０１３８】
ステップ１８０３において、具体的には、まずスレッド共有メモリ情報テーブル３４２ｃから、参照先オブジェクトＳＯに対応するスレッド共有メモリ情報のスレッド共有メモリ情報ＩＤ５０１を取得する。その後、取得されたスレッド共有メモリ情報ＩＤ５０１を、登録対象のテーブルの参照先フレーム共有メモリ情報ＩＤに設定する。
【０１３９】
すなわち図１６のステップ１６０７のように、登録対象のテーブルがフレーム専有メモリ情報テーブル３４２ａの場合は、フレーム専有メモリ情報テーブル３４２ａに格納されているスタックフレームＳに対応するフレーム専有メモリ情報の参照先スレッド共有メモリ情報ＩＤ３０６に設定する。また、図１９のステップ１９０８のように、登録対象のテーブルがフレーム共有メモリ情報テーブル３４２ｂの場合は、フレーム共有メモリ情報Ｆの参照先スレッド共有メモリ情報ＩＤ４０６に設定する。さらに、図２０のステップ２００８のように、登録対象のテーブルがスレッド共有メモリ情報テーブル３４２ｃの場合は、スレッド共有メモリ情報Ｔの参照先スレッド共有メモリ情報ＩＤ５０６に設定する。
【０１４０】
以上に示す処理により、メモリ使用量計算部３２４は、登録対象のテーブルに、スレッド共有メモリを使用している参照先オブジェクトＳＯのスレッド共有メモリ情報ＩＤを登録する。
【０１４１】
図１９は、本発明の実施の形態のフレーム共有メモリ使用量計算処理の手順を示すフローチャートである。図８のステップ８０７において、メモリ使用量計算部３２４は本処理を実行することによって、所定フレーム共有メモリ情報（以下、本処理の説明において、「フレーム共有メモリ情報Ｆ」という。）のフレーム共有メモリ使用量を計算する。
【０１４２】
まずステップ１９０１において、メモリ使用量計算部３２４は、フレーム共有メモリ情報Ｆのアドレス４０２が指し示す参照先オブジェクト（以下、本処理の説明において、「参照先オブジェクトＦＲ」という。）のメモリ使用量を、フレーム共有メモリ情報Ｆのフレーム共有メモリ使用量４０４に加算し、処理対象を参照先オブジェクトＦＲに移動する（Ｓ１９０１）。
【０１４３】
その後ステップ１９０２において、メモリ使用量計算部３２４は、未処理の参照先オブジェクトについて、ステップ１９０３〜１９０８の処理を実行する。すなわち参照先オブジェクトＦＲの全ての参照先オブジェクトについて、ステップ１９０３〜１９０８の処理を実行する。
【０１４４】
ステップ１９０３では、メモリ使用量計算部３２４は、未処理の参照先オブジェクトのオブジェクト種別を判定する（Ｓ１９０３）。
【０１４５】
未処理の参照先オブジェクトのオブジェクト種別が"必要"の場合は、当該未処理の参照先オブジェクトが使用しているメモリは、参照先オブジェクトＦＲと同じフレーム共有メモリである。そのため、メモリ使用量計算部３２４は、当該未処理の参照先オブジェクトのメモリ使用量を、フレーム共有メモリ情報Ｆのフレーム共有メモリ使用量４０４に加算する（Ｓ１９０４）。その後、処理対象を当該未処理の参照先オブジェクトの参照先オブジェクトに移動する（Ｓ１９０５）。その後、移動後の参照先オブジェクトに対して、当該フレーム共有メモリ使用量計算処理（図１９）を再帰的に実行する（Ｓ１９０６）。
【０１４６】
未処理の参照先オブジェクトのオブジェクト種別が"フレーム共有"の場合は、当該未処理の参照先オブジェクトが使用しているメモリは、参照先オブジェクトＦＲと異なるフレーム共有メモリである。そのため、メモリ使用量計算部３２４は、（フレーム共有メモリ情報テーブル３４２ｂを登録対象とした）フレーム共有メモリ情報ＩＤ登録処理を実行する（Ｓ１９０７）。その後、ステップ１９０１に戻って、処理対象を当該未処理の参照先オブジェクトとは別の未処理の参照先オブジェクトに移動する。フレーム共有メモリ情報ＩＤ登録処理の詳細については、図１７を参照して前述した通りである。
【０１４７】
未処理の参照先オブジェクトのオブジェクト種別が"スレッド共有"の場合は、当該未処理の参照先オブジェクトが使用しているメモリは、スレッド共有メモリである。そのため、メモリ使用量計算部３２４は、（フレーム共有メモリ情報テーブル３４２ｂを登録対象とした）スレッド共有メモリ情報ＩＤ登録処理を実行する（Ｓ１９０８）。その後、ステップ１９０１に戻って、処理対象を当該未処理の参照先オブジェクトとは別の未処理の参照先オブジェクトに移動する。スレッド共有メモリ情報ＩＤ登録処理の詳細については、図１８を参照して前述した通りである。
【０１４８】
以上に示す処理により、メモリ使用量計算部３２４は、フレーム共有メモリ情報Ｆのアドレス４０２が指し示す参照先オブジェクトＦＲ内のオブジェクト参照を再帰的に辿りながら、フレーム共有メモリ情報Ｆのフレーム共有メモリ使用量４０４を計算する。
【０１４９】
例えば図１５において、フレーム共有メモリ情報ＩＤが"＃Ｆ３"で示されるフレーム共有メモリ情報のフレーム共有メモリ使用量は、当該フレーム共有メモリ情報の参照先オブジェクトのメモリ使用量"７６"と、当該参照先オブジェクトの参照先のオブジェクトであって、オブジェクト種別が"必要"である参照先オブジェクトのメモリ使用量"８"とを加算した"８４"となる。
【０１５０】
図２０は、本発明の実施の形態のスレッド共有メモリ使用量計算処理の手順を示すフローチャートである。図８のステップ８０８において、メモリ使用量計算部３２４は本処理を実行することによって、所定スレッド共有メモリ情報（以下、本処理の説明において、「スレッド共有メモリ情報Ｔ」という。）のスレッド共有メモリ使用量を計算する。
【０１５１】
まずステップ２００１において、メモリ使用量計算部３２４は、スレッド共有メモリ情報Ｔのアドレス５０２が指し示す参照先オブジェクト（以下、本処理の説明において、「参照先オブジェクトＴＲ」という。）のメモリ使用量を、スレッド共有メモリ情報Ｔのスレッド共有メモリ使用量５０４に加算し、処理対象を参照先オブジェクトＴＲに移動する（Ｓ２００１）。
【０１５２】
その後ステップ２００２において、メモリ使用量計算部３２４は、未処理の参照先オブジェクトについて、ステップ２００３〜２００８の処理を実行する。すなわち参照先オブジェクトＴＲの全ての参照先オブジェクトについて、ステップ２００３〜２００８の処理を実行する。
【０１５３】
ステップ２００３では、メモリ使用量計算部３２４は、未処理の参照先オブジェクトのオブジェクト種別を判定する（Ｓ２００３）。
【０１５４】
未処理の参照先オブジェクトのオブジェクト種別が"必要"の場合は、当該未処理の参照先オブジェクトが使用しているメモリは、参照先オブジェクトＴＲと同じスレッド共有メモリである。そのため、メモリ使用量計算部３２４は、当該未処理の参照先オブジェクトのメモリ使用量を、スレッド共有メモリ情報Ｔのスレッド共有メモリ使用量５０４に加算する（Ｓ２００４）。その後、処理対象を当該未処理の参照先オブジェクトの参照先オブジェクトに移動する（Ｓ２００５）。その後、移動後の参照先オブジェクトに対して、当該スレッド共有メモリ使用量計算処理（図２０）を再帰的に実行する（Ｓ２００６）。
【０１５５】
未処理の参照先オブジェクトのオブジェクト種別が"フレーム共有"の場合は、当該未処理の参照先オブジェクトが使用しているメモリは、フレーム共有メモリである。そのため、メモリ使用量計算部３２４は、（スレッド共有メモリ情報テーブル３４２ｃを登録対象とした）フレーム共有メモリ情報ＩＤ登録処理を実行する（Ｓ２００７）。その後、ステップ２００１に戻って、処理対象を当該未処理の参照先オブジェクトとは別の未処理の参照先オブジェクト参照に移動する。フレーム共有メモリ情報ＩＤ登録処理の詳細については、図１７を参照して前述した通りである。
【０１５６】
未処理の参照先オブジェクトのオブジェクト種別が"スレッド共有"の場合は、当該未処理の参照先オブジェクトが使用しているメモリは、参照先オブジェクトＴＲと異なるスレッド共有メモリである。そのため、メモリ使用量計算部３２４は、（スレッド共有メモリ情報テーブル３４２ｃを登録対象とした）スレッド共有メモリ情報ＩＤ登録処理を実行する（Ｓ２００８）。その後、ステップ２００１に戻って、処理対象を当該未処理の参照先オブジェクトとは別の未処理の参照先オブジェクトに移動する。スレッド共有メモリ情報ＩＤ登録処理の詳細については、図１８を参照して前述した通りである。
【０１５７】
以上に示す処理により、メモリ使用量計算部３２４は、スレッド共有メモリ情報Ｔのアドレス５０２が指し示す参照先オブジェクトＴＲ内のオブジェクト参照を再帰的に辿りながら、スレッド共有メモリ情報Ｔのスレッド共有メモリ使用量５０４を計算する。
【０１５８】
例えば図１５において、スレッド共有メモリ情報ＩＤが"＃Ｔ１"で示されるスレッド共有メモリ情報のスレッド共有メモリ使用量は、当該スレッド共有メモリ情報の参照先オブジェクトのメモリ使用量"７２"となる。
【０１５９】
［目的別メモリ使用量計算の例］
【０１６０】
以下、図２１〜図２８を用いて、図８のステップ８１０における目的別メモリ使用量計算処理の例を説明する。
【０１６１】
［１．特定スレッドの総メモリ使用量の計算］
【０１６２】
図２１は、本発明の実施の形態の特定スレッドの総メモリ使用量の計算処理の手順を示すフローチャートである。
【０１６３】
メモリ使用量計算部３２４は、本処理を実行することによって、特定スレッドの総メモリ使用量を計算することができる。なお、特定スレッドの専有メモリ使用量（図２５参照）と共有メモリ使用量（図２６参照）が既に計算されている場合には、専有メモリ使用量と共有メモリ使用量の和として、総メモリ使用量を計算することができる。
【０１６４】
特定スレッドの総メモリ使用量は、以下のＳ＿ＳＵＭ、Ｆ＿ＳＵＭ及びＴ＿ＳＵＭの和として計算することができる。
【０１６５】
Ｓ＿ＳＵＭ：フレーム専有メモリ情報テーブル３４２ａに登録されているスレッドＩＤ３０２が同じフレーム専有メモリ情報Ｓのフレーム専有メモリ使用量３０４の合計値。
【０１６６】
Ｆ＿ＳＵＭ：フレーム専有メモリ情報Ｓの参照先フレーム共有メモリ情報ＩＤ３０５や参照先スレッド共有メモリ情報ＩＤ３０６から直接、又は、間接的に参照しているフレーム共有メモリ情報ＩＤ４０１の集合Ｆが示すフレーム共有メモリ情報のフレーム共有メモリ使用量４０４の合計値。
【０１６７】
Ｔ＿ＳＵＭ：フレーム専有メモリ情報Ｓの参照先フレーム共有メモリ情報ＩＤ３０５や参照先スレッド共有メモリ情報ＩＤ３０６から直接、又は、間接的に参照しているスレッド共有メモリ情報ＩＤ５０１の集合Ｔが示すスレッド共有メモリ情報のスレッド共有メモリ使用量５０４の合計値。
【０１６８】
以下、図２１のフローチャートについて説明する。なお、以下では、具体例として、スレッドＩＤ３０２（図３参照）が"＃１"のスレッドの総メモリ使用量を計算する場合を例に説明する。
【０１６９】
まずステップ２１０１において、メモリ使用量計算部３２４は、スレッドＩＤ３０２が同じ"＃１"である各フレーム専有メモリ情報（以下、本処理の説明において「フレーム専有メモリ情報Ｓ」という。）について、ステップ２１０２〜２１０４の処理を繰り返す。なお、上記具体例でいうフレーム専有メモリ情報Ｓとは、図３に示すフレーム専有メモリ情報ＩＤ３０１が"＃１"のフレーム専有メモリ情報と、フレーム専有メモリ情報ＩＤ３０１が"＃２"のフレーム専有メモリ情報とを示す。
【０１７０】
ステップ２１０２において、メモリ使用量計算部３２４は、フレーム専有メモリ情報Ｓのフレーム専有メモリ使用量を、合計値Ｓ＿ＳＵＭに加算する（Ｓ２１０２）。すなわち合計値Ｓ＿ＳＵＭは、フレーム専有メモリ情報ＩＤ３０１が"＃１"のフレーム専有メモリ使用量"８４"と、フレーム専有メモリ情報ＩＤ３０１が"＃２"のフレーム専有メモリ使用量"３６"との和 "１２０"となる。
【０１７１】
すなわちこのステップ２１０２によって、メモリ使用量計算部３２４は、対象スレッド（ここではスレッドＩＤ３０２が"＃１"のスレッド）から参照されている各オブジェクトの参照関係に基づいて、当該対象スレッドによって専有して使用される（すなわち重複して使用されない）オブジェクトを判定し、当該オブジェクトのメモリ使用量を計算している。
【０１７２】
ステップ２１０３において、メモリ使用量計算部３２４は、フレーム専有メモリ情報Ｓの参照先フレーム共有メモリ情報ＩＤ３０５に対し、参照先フレーム共有メモリ情報ＩＤ展開処理を実行する（Ｓ２１０３）。ステップ２１０３の処理により、フレーム専有メモリ情報Ｓの参照先フレーム共有メモリ情報ＩＤ３０５から直接、又は、間接的に参照しているフレーム共有メモリ情報ＩＤ４０１やスレッド共有メモリ情報ＩＤ５０１の情報を取得する。参照先フレーム共有メモリ情報ＩＤ展開処理の詳細については、図２２を用いて後述する。
【０１７３】
ステップ２１０４において、メモリ使用量計算部３２４は、フレーム専有メモリ情報Ｓの参照先スレッド共有メモリ情報ＩＤ３０６に対し、参照先スレッド共有メモリ情報ＩＤ展開処理を実行する（Ｓ２１０４）。ステップ２１０４の処理により、フレーム専有メモリ情報Ｓの参照先スレッド共有メモリ情報ＩＤ３０６から直接、又は、間接的に参照しているフレーム共有メモリ情報ＩＤ４０１やスレッド共有メモリ情報ＩＤ５０１の情報を取得する。参照先スレッド共有メモリ情報ＩＤ展開処理の詳細については、図２３を用いて後述する。
【０１７４】
その後ステップ２１０５において、メモリ使用量計算部３２４は、スレッドＩＤ３０２が同じ各フレーム専有メモリ情報Ｓについて、フレーム共有メモリ情報ＩＤ４０１の集合Ｆと、スレッド共有メモリ情報ＩＤ５０１の集合Ｔとを計算する（Ｓ２１０５）。
【０１７５】
すなわち各フレーム専有メモリ情報Ｓの参照先フレーム共有メモリ情報ＩＤ３０５や参照先スレッド共有メモリ情報ＩＤ３０６から直接、又は、間接的に参照しているフレーム共有メモリ情報ＩＤ４０１の集合Ｆ｛"＃Ｆ１"、"＃Ｆ２"｝と、スレッド共有メモリ情報ＩＤ５０１の集合Ｔ｛"＃Ｔ１"｝とを計算する（図２４参照）。
【０１７６】
なお、ステップ２１０５では、フレーム共有メモリ情報ＩＤ４０１の集合Ｆやスレッド共有メモリ情報ＩＤ５０１の集合Ｔを計算している。これは、複数のスタックフレームや複数のスレッドから参照されているフレーム共有メモリ及びスレッド共有メモリのメモリ使用量が、総メモリ使用量に重複して加算されるのを防ぐためである。
【０１７７】
すなわちこのステップ２１０５によって、メモリ使用量計算部３２４は、対象スレッドから参照されている各オブジェクトの参照関係に基づいて、重複して使用されているオブジェクトを判定している。
【０１７８】
その後ステップ２１０６において、メモリ使用量計算部３２４は、集合Ｆが示すフレーム共有メモリ情報のフレーム共有メモリ使用量４０４の合計値Ｆ＿ＳＵＭを計算する（Ｓ２１０６）。上記具体例では、集合Ｆは｛"＃Ｆ１"、"＃Ｆ２"｝である。そのため、ステップ２１０６において、合計値Ｆ＿ＳＵＭは、フレーム共有メモリ情報ＩＤ４０１が"＃Ｆ１"のフレーム共有メモリ使用量"６０"と、フレーム共有メモリ情報ＩＤ４０１が"＃Ｆ２"のフレーム共有メモリ使用量"１２"との和である"７２"となる。
【０１７９】
すなわちこのステップ２１０６によって、メモリ使用量計算部３２４は、ステップ２１０５で重複して使用されていると判定されたオブジェクトのうちの、対象スレッドにおける異なるスタックフレームが共有で（重複して）使用しているオブジェクトが格納されたメモリ領域の大きさ（メモリ使用量）を計算している。
【０１８０】
その後ステップ２１０７において、メモリ使用量計算部３２４は、集合Ｔが示すスレッド共有メモリ情報のスレッド共有メモリ使用量５０４の合計値Ｔ＿ＳＵＭを計算する（Ｓ２１０７）。上記具体例では、集合Ｔは｛"＃Ｔ1"｝である。そのため、ステップ２１０７において、合計値Ｔ＿ＳＵＭは、スレッド共有メモリ情報ＩＤ５０１が"＃Ｔ１"のスレッド共有メモリ使用量"７２"となる。
【０１８１】
すなわちこのステップ２１０７によって、メモリ使用量計算部３２４は、ステップ２１０５で重複して使用されていると判定されたオブジェクトのうちの、異なる複数のスレッド（対象スレッドを含む）が共有で（重複して）使用しているオブジェクトが格納されたメモリ領域の大きさを計算している。
【０１８２】
ステップ２１０８において、メモリ使用量計算部３２４は、合計値Ｓ＿ＳＵＭと合計値Ｆ＿ＳＵＭと合計値Ｔ＿ＳＵＭの和を計算する（Ｓ２１０８）。上記具体例では、スレッドＩＤが"＃１"のスレッドの総メモリ使用量は、"１２０"と"７２"と"７２"との和である"２６４"となる。
【０１８３】
以上に示す処理により、メモリ使用量計算部３２４は、特定スレッド（ここでは、スレッドＩＤ３０２が"＃１"のスレッド）の総メモリ使用量を計算することができる。なお、スレッドの総メモリ使用量は、言い換えると、当該スレッドを終了した場合に解放される最大メモリ解放量である。
【０１８４】
図２２は、本発明の実施の形態の参照先フレーム共有メモリ情報ＩＤ展開処理の手順を示すフローチャートである。図２１のステップ２１０３において、メモリ使用量計算部３２４は本処理を実行する。
【０１８５】
まずステップ２２０１において、メモリ使用量計算部３２４は、処理対象のフレーム専有メモリ情報Ｓの参照先フレーム共有メモリ情報ＩＤ３０５（図３参照）に登録されている各フレーム共有メモリ情報ＩＤ４０１について、ステップ２２０２の処理を実行する。
【０１８６】
ステップ２２０２において、メモリ使用量計算部３２４は、各フレーム共有メモリ情報ＩＤ４０１から直接、又は、間接的に参照しているフレーム共有メモリ情報ＩＤ４０１とスレッド共有メモリ情報ＩＤ５０１とを展開する（２２０２）。
【０１８７】
例えば、処理対象のフレーム専有メモリ情報Ｓのフレーム専有メモリ情報ＩＤ３０１が"＃３"（図３参照）である場合を考える。この場合、フレーム専有メモリ情報テーブル３４２ａにおいて、当該フレーム専有メモリ情報Ｓの参照先フレーム共有メモリ情報ＩＤ３０５には"＃Ｆ３"が登録されている。一方、フレーム共有メモリ情報テーブル３４２ｂ（図４参照）において、フレーム共有メモリ情報ＩＤ４０１が"＃Ｆ３"であるフレーム共有メモリ情報の参照先スレッド共有メモリ情報ＩＤ４０６には"＃Ｔ１"が登録されている。また、スレッド共有メモリ情報テーブル３４２ｃ（図５参照）において、スレッド共有メモリ情報ＩＤ５０１が"＃Ｔ１"であるスレッド共有メモリ情報の参照先フレーム共有メモリ情報ＩＤ５０５には"＃Ｆ２"が登録されている。
【０１８８】
これは、フレーム共有メモリ情報ＩＤ４０１が"＃Ｆ３"のフレーム共有メモリ情報に対応するフレーム共有メモリが、スレッド共有メモリ情報ＩＤ５０１が"＃Ｔ１"であるスレッド共有メモリ情報に対応するスレッド共有メモリを直接的に参照していることを示している。また、フレーム共有メモリ情報ＩＤ４０１が"＃Ｆ２"のフレーム共有メモリ情報に対応するフレーム共有メモリを間接的に参照していることを示している。
【０１８９】
以上に示す処理により、メモリ使用量計算部３２４は、処理対象のフレーム専有メモリ情報Ｓの参照先フレーム共有メモリ情報ＩＤ３０５に登録されているフレーム共有メモリ情報ＩＤ４０１から直接、又は、間接的に参照しているフレーム共有メモリ情報ＩＤ４０１とスレッド共有メモリ情報ＩＤ５０１とを展開する。すなわちフレーム専有メモリ情報Ｓの参照先フレーム共有メモリと、他のフレーム共有メモリ及びスレッド共有メモリとの間の参照関係を取得している。
【０１９０】
図２３は、本発明の実施の形態の参照先スレッド共有メモリ情報ＩＤ展開処理の手順を示すフローチャートである。図２１のステップ２１０４において、メモリ使用量計算部３２４は本処理を実行する。
【０１９１】
まずステップ２３０１において、メモリ使用量計算部３２４は、処理対象のフレーム専有メモリ情報Ｓの参照先スレッド共有メモリ情報ＩＤ３０６（図３参照）に登録されている各スレッド共有メモリ情報ＩＤ５０１について、ステップ２３０２の処理を実行する。
【０１９２】
ステップ２３０２において、メモリ使用量計算部３２４は、各スレッド共有メモリ情報ＩＤ５０１から直接、又は、間接的に参照しているフレーム共有メモリ情報ＩＤ４０１とスレッド共有メモリ情報ＩＤ５０１とを展開する（２３０２）。
【０１９３】
以上に示す処理により、メモリ使用量計算部３２４は、処理対象のフレーム専有メモリ情報Ｓの参照先スレッド共有メモリ情報ＩＤ３０６に登録されているスレッド共有メモリ情報ＩＤ５０１から直接、又は、間接的に参照しているフレーム共有メモリ情報ＩＤ４０１とスレッド共有メモリ情報ＩＤ５０１とを展開する。すなわちフレーム専有メモリ情報Ｓの参照先スレッド共有メモリと、フレーム共有メモリ及び他のスレッド共有メモリとの参照関係を取得している。
【０１９４】
図２４は、本発明の実施の形態の展開後のフレーム専有メモリ情報テーブル３４２ａの一例を示す図である。
【０１９５】
図２４に示す展開後のフレーム専有メモリ情報テーブル３４２ａにおける参照先フレーム共有メモリ情報ＩＤ８０５、参照先スレッド共有メモリ情報ＩＤ８０６は、図３に示すフレーム専有メモリ情報テーブル３４２ａにおける参照先フレーム共有メモリ情報ＩＤ３０５、参照先スレッド共有メモリ情報ＩＤ３０６に対応する。なお、前述の図３と同じ構成要素については、同一の符号を付して重複する説明を省略する。
【０１９６】
参照先フレーム共有メモリ情報ＩＤ８０５は、参照先フレーム共有メモリ情報ＩＤ３０５が、図２２に示す参照先フレーム共有メモリ情報ＩＤ展開処理によって展開されたものである。例えば、フレーム専有メモリ情報ＩＤ３０１が"＃３"の参照先フレーム共有メモリ情報ＩＤ８０５には、"＃Ｆ３→＃Ｔ１→＃Ｆ２"が登録されている。
【０１９７】
これは、フレーム共有メモリ情報ＩＤ４０１が"＃Ｆ３"のフレーム共有メモリ情報に対応するフレーム共有メモリが、スレッド共有メモリ情報ＩＤ５０１が"＃Ｔ１"のスレッド共有メモリ情報に対応するスレッド共有メモリを直接的に参照していることを示している。また、フレーム共有メモリ情報ＩＤ４０１が"＃Ｆ２"のフレーム共有メモリ情報に対応するフレーム共有メモリを間接的に参照していることを示している。
【０１９８】
参照先スレッド共有メモリ情報ＩＤ８０６は、参照先スレッド共有メモリ情報ＩＤ３０６が、図２３に示す参照先スレッド共有メモリ情報ＩＤ展開処理によって展開されたものである。例えば、フレーム専有メモリ情報ＩＤ３０１が"＃２"の参照先スレッド共有メモリ情報ＩＤ８０６には、"＃Ｔ１→＃Ｆ２"が登録されている。
【０１９９】
これは、スレッド共有メモリ情報ＩＤ５０１が"＃Ｔ１"のスレッド共有メモリ情報に対応するスレッド共有メモリが、フレーム共有メモリ情報ＩＤ４０１が"＃Ｆ２"のフレーム共有メモリ情報に対応するフレーム共有メモリを直接的に参照していることを示している。
【０２００】
［２．特定スレッドの専有メモリ使用量の計算］
【０２０１】
図２５は、本発明の実施の形態の特定スレッドの専有メモリ使用量の計算処理の手順を示すフローチャートである。
【０２０２】
メモリ使用量計算部３２４は、本処理を実行することによって、特定スレッドの専有メモリ使用量を計算することができる。なお、特定スレッドの総メモリ使用量（図２１参照）と共有メモリ使用量（図２６参照）が既に計算されている場合には、総メモリ使用量と共有メモリ使用量の差として、専有メモリ使用量を計算することができる。
【０２０３】
特定スレッドの専有メモリ使用量は、以下のＳ＿ＳＵＭ及びＦ＿ＳＵＭの和として計算することができる。
【０２０４】
Ｓ＿ＳＵＭ：フレーム専有メモリ情報テーブル３４２ａに登録されているスレッドＩＤ３０２が同じフレーム専有メモリ情報Ｓのフレーム専有メモリ使用量３０４の合計値。
【０２０５】
Ｆ＿ＳＵＭ：フレーム専有メモリ情報Ｓの参照先フレーム共有メモリ情報ＩＤ３０５や参照先スレッド共有メモリ情報ＩＤ３０６から直接、又は、間接的に参照しているフレーム共有メモリ情報ＩＤ４０１の集合Ａのうち、スレッド共有メモリ情報ＩＤ５０１を経由して参照しているフレーム共有メモリ情報ＩＤ４０１の集合Ｂを除く集合Ｆが示すフレーム共有メモリ情報のフレーム共有メモリ使用量４０４の合計値。
【０２０６】
以下、図２５のフローチャートについて説明する。なお、以下では、具体例として、スレッドＩＤ３０２（図３参照）が"＃１"のスレッドの専有メモリ使用量を計算する場合を例に説明する。前述の図２１と同じ構成要素については、同一の符号を付して重複する説明を省略する。
【０２０７】
ステップ２５０１において、メモリ使用量計算部３２４は、スレッドＩＤ３０２が同じ各フレーム専有メモリ情報Ｓについて、フレーム共有メモリ情報ＩＤ４０１の集合Ａのうち、スレッド共有メモリ情報ＩＤ５０１を経由しているフレーム共有メモリ情報ＩＤ４０１の集合Ｂを除く集合Ｆを計算する（Ｓ２５０１）。
【０２０８】
すなわちまず各フレーム専有メモリ情報Ｓの参照先フレーム共有メモリ情報ＩＤ３０５や参照先スレッド共有メモリ情報ＩＤ３０６から直接、又は、間接的に参照しているフレーム共有メモリ情報ＩＤ４０１の集合Ａ｛"＃Ｆ１"、"＃Ｆ２"｝を計算する（図２４参照）。
【０２０９】
次に、集合Ａのうち、スレッド共有メモリ情報ＩＤ５０１に対応するスレッド共有メモリを経由して参照しているフレーム共有メモリ情報ＩＤ４０１の集合Ｂ｛"＃Ｆ２"｝を計算する。その結果、集合Ａのうち集合Ｂを除く集合Ｆ｛"＃Ｆ１"｝を計算する。
【０２１０】
なお、ステップ２５０１では、集合Ａのうち集合Ｂを除く集合Ｆを計算している。これは、異なる複数のスレッドで共有しているフレーム共有メモリのメモリ使用量が、専有メモリ使用量に加算されるのを防ぐためである。
【０２１１】
例えば、フレーム共有メモリ情報ＩＤ４０１が"＃Ｆ２"のフレーム共有メモリ情報に対応するフレーム共有メモリは、スレッド共有メモリ情報ＩＤ５０１が"＃Ｔ１"のスレッド共有メモリ情報に対応するスレッド共有メモリから参照されている。本発明の実施の形態では、このようにスレッド共有メモリから参照されているフレーム共有メモリを、スレッド共有メモリではなく、フレーム共有メモリとして種別している。そこで、ステップ２５０１の処理によって、このようにスレッド共有メモリから参照されているフレーム共有メモリのメモリ使用量が、専有メモリ使用量に加算されるのを防いでいる。
【０２１２】
なお、このように異なる複数のスレッドから参照されているフレーム共有メモリを、スレッド共有メモリとして種別してもよい。この場合、ステップ２５０１で計算される集合Ｆは、フレーム専有メモリ情報Ｓの参照先フレーム共有メモリ情報ＩＤ３０５や参照先スレッド共有メモリ情報ＩＤ３０６から直接、又は、間接的に参照しているフレーム共有メモリ情報ＩＤ４０１の集合となる。
【０２１３】
すなわちこのステップ２５０１によって、メモリ使用量計算部３２４は、対象スレッドから参照されている各オブジェクトの参照関係に基づいて、重複して使用されているオブジェクトを判定している。
【０２１４】
その後ステップ２５０２において、メモリ使用量計算部３２４は、集合Ｆが示すフレーム共有メモリ情報のフレーム共有メモリ使用量４０４の合計値Ｆ＿ＳＵＭを計算する（Ｓ２５０２）。上記具体例では、集合Ｆは｛"＃Ｆ１"｝である。そのため、ステップ２５０２において、合計値Ｆ＿ＳＵＭは、フレーム共有メモリ情報ＩＤ４０１が"＃Ｆ１"のフレーム共有メモリ使用量"６０"となる。
【０２１５】
すなわちこのステップ２５０２によって、メモリ使用量計算部３２４は、ステップ２５０１で重複して使用されていると判定されたオブジェクトのうちの、対象スレッドにおける異なるスタックフレームが共有で（重複して）使用しているオブジェクトが格納されたメモリ領域の大きさを計算している。
【０２１６】
その後ステップ２５０３において、メモリ使用量計算部３２４は、合計値Ｓ＿ＳＵＭと合計値Ｆ＿ＳＵＭの和を計算する（Ｓ２５０３）。上記具体例では、スレッドＩＤが"＃１"のスレッドの専有メモリ使用量は、"１２０"と"６０"との和である"１８０"となる。
【０２１７】
以上に示す処理により、メモリ使用量計算部３２４は、特定スレッド（ここでは、スレッドＩＤ３０２が"＃１"のスレッド）の専有メモリ使用量を計算することができる。なお、スレッドの専有メモリ使用量は、言い換えると、当該スレッドを終了した場合に必ず解放されるメモリ解放量である。
【０２１８】
［３．特定スレッドの共有メモリ使用量の計算］
【０２１９】
図２６は、本発明の実施の形態の特定スレッドの共有メモリ使用量の計算処理の手順を示すフローチャートである。
【０２２０】
メモリ使用量計算部３２４は、本処理を実行することによって、特定スレッドの共有メモリ使用量を計算することができる。なお、特定スレッドの総メモリ使用量（図２１参照）と専有メモリ使用量（図２５参照）が既に計算されている場合は、総メモリ使用量と専有メモリ使用量の差として、共有メモリ使用量を計算することができる。
【０２２１】
特定スレッドの共有メモリ使用量は、以下のＴ＿ＳＵＭ及びＦ＿ＳＵＭの和として計算することができる。
【０２２２】
Ｔ＿ＳＵＭ：フレーム専有メモリ情報テーブル３４２ａに登録されているスレッドＩＤ３０２が同じフレーム専有メモリ情報Ｓの参照先フレーム共有メモリ情報ＩＤ３０５や参照先スレッド共有メモリ情報ＩＤ３０６から直接、又は、間接的に参照しているスレッド共有メモリ情報ＩＤ５０１の集合Ｔが示すスレッド共有メモリ情報のスレッド共有メモリ使用量５０４の合計値。
【０２２３】
Ｆ＿ＳＵＭ：フレーム専有メモリ情報Ｓの参照先フレーム共有メモリ情報ＩＤ３０５や参照先スレッド共有メモリ情報ＩＤ３０６から直接、又は、間接的に参照しているフレーム共有メモリ情報ＩＤ４０１の集合Ａのうち、スレッド共有メモリ情報ＩＤ５０１を経由して参照しているフレーム共有メモリ情報ＩＤ４０１の集合Ｆが示すフレーム共有メモリ情報のフレーム共有メモリ使用量４０４の合計値。
【０２２４】
以下、図２６のフローチャートについて説明する。なお、以下では、具体例として、スレッドＩＤ３０２（図３参照）が"＃１"のスレッドの共有メモリ使用量を計算する場合を例に説明する。前述の図２１と同じ構成要素については、同一の符号を付して重複する説明を省略する。
【０２２５】
ステップ２６０１において、メモリ使用量計算部３２４は、スレッドＩＤ３０２が同じ各フレーム専有メモリ情報Ｓについて、スレッド共有メモリ情報ＩＤ５０１の集合Ｔを計算する（Ｓ２６０１）。
【０２２６】
すなわちスレッドＩＤ３０２が同じ"＃１"である各フレーム専有メモリ情報Ｓの参照先スレッド共有メモリ情報ＩＤ３０６から直接、又は、間接的に参照しているスレッド共有メモリ情報ＩＤ５０１の集合Ｔ｛"＃Ｔ１"｝を計算する（図２４参照）。
【０２２７】
すなわちこのステップ２６０１によって、メモリ使用量計算部３２４は、対象スレッドから参照されている各オブジェクトの参照関係に基づいて、異なる複数のスレッド（対象スレッドを含む）が共有で（重複して）使用しているオブジェクトを判定している。
【０２２８】
その後ステップ２６０２において、メモリ使用量計算部３２４は、スレッドＩＤ３０２が同じ各フレーム専有メモリ情報Ｓについて、フレーム共有メモリ情報ＩＤ４０１の集合Ａのうち、スレッド共有メモリ情報ＩＤ５０１を経由しているフレーム共有メモリ情報ＩＤ４０１の集合Ｆを計算する（Ｓ２６０２）。
【０２２９】
すなわちまず各フレーム専有メモリ情報Ｓの参照先フレーム共有メモリ情報ＩＤ３０５や参照先スレッド共有メモリ情報ＩＤ３０６から直接、又は、間接的に参照しているフレーム共有メモリ情報ＩＤ４０１の集合Ａ｛"＃Ｆ１"、"＃Ｆ２"｝を計算する（図２４参照）。
【０２３０】
次に、集合Ａのうち、スレッド共有メモリ情報ＩＤ５０１に対応するスレッド共有メモリを経由して参照しているフレーム共有メモリ情報ＩＤ４０１の集合Ｆ｛"＃Ｆ２"｝を計算する。
【０２３１】
なお、ステップ２６０２では、集合Ａのうちの集合Ｆを計算している。これは、異なる複数のスレッドで共有しているフレーム共有メモリのメモリ使用量を、共有メモリ使用量に加算するためである。
【０２３２】
すなわちこのステップ２６０２によって、メモリ使用量計算部３２４は、対象スレッドから参照されている各オブジェクトの参照関係に基づいて、対象スレッドにおける異なるスタックフレームが共有で（重複して）使用しているオブジェクトを判定している。
【０２３３】
その後ステップ２６０３において、メモリ使用量計算部３２４は、集合Ｔが示すスレッド共有メモリ情報のスレッド共有メモリ使用量５０４の合計値Ｔ＿ＳＵＭを計算する（Ｓ２６０３）。上記具体例では、集合Ｔは｛"＃Ｔ１"｝である。そのため、ステップ２６０３において、合計値Ｔ＿ＳＵＭは、スレッド共有メモリ情報ＩＤ５０１が"＃Ｔ１"のスレッド共有メモリ使用量"７２"となる。
【０２３４】
すなわちこのステップ２６０３によって、メモリ使用量計算部３２４は、ステップ２６０１で重複して使用されていると判定されたオブジェクトが格納されたメモリ領域の大きさを計算している。
【０２３５】
その後ステップ２６０４において、メモリ使用量計算部３２４は、集合Ｆが示すフレーム共有メモリ情報のフレーム共有メモリ使用量４０４の合計値Ｆ＿ＳＵＭを計算する（Ｓ２６０４）。上記具体例では、集合Ｆは｛"＃Ｆ２"｝である。そのため、ステップ２６０４において、合計値Ｆ＿ＳＵＭは、フレーム共有メモリ情報ＩＤ４０１が"＃Ｆ２"のフレーム共有メモリ使用量"１２"となる。
【０２３６】
すなわちこのステップ２６０４によって、メモリ使用量計算部３２４は、ステップ２６０２で重複して使用されていると判定されたオブジェクトが格納されたメモリ領域の大きさを計算している。
【０２３７】
その後ステップ２６０５において、メモリ使用量計算部３２４は、合計値Ｔ＿ＳＵＭと合計値Ｆ＿ＳＵＭの和を計算する（Ｓ２６０５）。上記具体例では、スレッドＩＤが"＃１"のスレッドの共有メモリ使用量は、"７２"と"１２"との和である"８４"となる。
【０２３８】
以上に示す処理により、メモリ使用量計算部３２４は、特定スレッド（ここでは、スレッドＩＤ３０２が"＃１"のスレッド）の共有メモリ使用量を計算することができる。なお、スレッドの共有メモリ使用量は、当該スレッドの終了により必ず解放されるとは限らないメモリ解放量である。
【０２３９】
図２７は、本発明の実施の形態の各スレッドの目的別メモリ使用量の一例を示す図である。
【０２４０】
図２７に示す例では、図１５に示す各スレッド１〜ｎの専有メモリ使用量、共有メモリ使用量及び総メモリ使用量を示している。すなわちスレッドＩＤ２７０１と、専有メモリ使用量２７０２と、共有メモリ使用量２７０３と、総メモリ使用量２７０４とを対応付けて示している。
【０２４１】
専有メモリ使用量２７０２は、図２５に示す処理によって計算される。共有メモリ使用量２７０３は、図２６に示す処理によって計算される。総メモリ使用量２７０４は、図２１に示す処理によって計算される。
【０２４２】
［４．複数スレッドのメモリ使用量及びメモリ解放量の計算］
【０２４３】
次に、メモリ使用量計算部３２４が、複数スレッドのメモリ使用量及びメモリ解放量を計算する処理について説明する。
【０２４４】
まず、複数スレッドのメモリ使用量について説明する。
【０２４５】
メモリ使用量計算部３２４は、複数スレッドのメモリ使用量を計算する場合には、当該複数スレッドが共有しているフレーム共有メモリとスレッド共有メモリの参照関係を考慮する。なお、参照関係は、前述の参照先フレーム共有メモリ情報ＩＤ展開処理（図２２参照）及び参照先スレッド共有メモリ情報ＩＤ展開処理（図２３参照）によって取得される。
【０２４６】
例えば、図２４に示す展開後のフレーム専有メモリ情報テーブル３４２ｄにおいて、スレッドＩＤ３０２が"＃１"であるスレッドは、スレッド共有メモリ情報ＩＤ５０１が"＃Ｔ１"であるスレッド共有メモリ情報に対応するスレッド共有メモリを参照している。
【０２４７】
同様に、スレッドＩＤ３０２が"＃２"であるスレッドは、スレッド共有メモリ情報ＩＤ５０１が"＃Ｔ１"であるスレッド共有メモリ情報に対応するスレッド共有メモリを参照している。
【０２４８】
また、スレッドＩＤ３０２が"＃３"であるスレッドは、スレッド共有メモリ情報ＩＤ５０１が"＃Ｔ１"、"＃Ｔ２"であるスレッド共有メモリ情報に対応するスレッド共有メモリを参照している。
【０２４９】
また、スレッドＩＤ３０２が"＃ｎ"であるスレッドは、スレッド共有メモリ情報ＩＤ５０１が"＃Ｔ２"であるスレッド共有メモリ情報に対応するスレッド共有メモリを参照している。
【０２５０】
すなわちスレッドＩＤ３０２が"＃１"、"＃２"、"＃３"であるスレッドは、スレッド共有メモリ情報ＩＤ５０１が"＃Ｔ１"であるスレッド共有メモリ情報に対応するスレッド共有メモリを共有している。同様に、スレッドＩＤ３０２が"＃３"、"＃ｎ"であるスレッドは、スレッド共有メモリ情報ＩＤ５０１が"＃Ｔ２"であるスレッド共有メモリ情報に対応するスレッド共有メモリを共有している。
【０２５１】
そのため、メモリ使用量計算部３２４は、複数スレッドのメモリ使用量を計算する場合には、上記参照関係に基づいて、当該複数スレッドが共有しているフレーム共有メモリ情報及びスレッド共有メモリの使用量が重複して加算されないように計算する。
【０２５２】
また、他のスレッドとスレッド共有メモリＴを共有するスレッドＸを新たに実行する場合、メモリ使用量計算部３２４は、スレッドＸによるメモリ使用量の増加量を計算することができる。
【０２５３】
例えば、スレッドＸが新たに実行されたときに、スレッド共有メモリＴを参照している他のスレッドが存在しない場合には、スレッドＸによるメモリ使用量の増加量は、スレッドＸの専有メモリ使用量とスレッド共有メモリＴの使用量との和である。一方、スレッド共有メモリＴを参照している他のスレッドが存在する場合には、スレッドＸによるメモリ使用量の増加量は、スレッドＸの専有メモリ使用量である。
【０２５４】
メモリ使用量計算部３２４は、複数スレッドを終了させた場合のメモリ解放量を計算することができる。
【０２５５】
図２８は、本発明の実施の形態の複数スレッドを終了させた場合のメモリ解放量の一例を示す図である。
【０２５６】
図２８では、図１５に示すスレッド１〜ｎのうちの任意の２つのスレッドを終了させた場合のスレッド専有メモリ解放量、スレッド共有メモリ解放量及び総メモリ解放量を示している。すなわちスレッドＩＤ２８０１と、スレッド専有メモリ解放量２８０２と、スレッド共有メモリ解放量２８０３と、総メモリ解放量２８０４とを対応付けて示している。
【０２５７】
スレッド専有メモリ解放量２８０２は、スレッドＩＤ２８０１に示す複数スレッドを終了させた場合のスレッド専有メモリの解放量である。このスレッド専有メモリ解放量２８０２は、スレッドＩＤ２８０１に示す各スレッドのスレッド専有メモリ使用量の合計値として計算される。
【０２５８】
例えば、スレッドＩＤ２８０１が｛"＃１"、"＃２"｝である場合に、スレッド専有メモリ解放量２８０２は、スレッドＩＤ２７０１（図２７参照）が"＃１"のフレーム専有メモリ使用量"１８０"と、スレッドＩＤ２７０１が"＃２"のフレーム専有メモリ使用量"１２０"との和"３００"となる。
【０２５９】
スレッド共有メモリ解放量２８０３は、スレッドＩＤ２８０１に示す複数スレッドを終了させた場合のスレッド共有メモリの解放量である。このスレッド共有メモリ解放量２８０３は、スレッドＩＤ２８０１に示す複数スレッドのみによって共有されるスレッド共有メモリのスレッド共有メモリ使用量として計算される。
【０２６０】
例えば、スレッドＩＤ２８０１が｛"＃１"、"＃２"｝である場合には、これら２つのスレッドのみによって共有されるスレッド共有メモリは存在しない。そのため、スレッド共有メモリ解放量２８０３は、"０"となる。一方、スレッドＩＤ２８０１が｛"＃３"、"＃ｎ"｝である場合に、スレッド共有メモリ解放量２８０３は、これら２つのスレッドのみによって共有されるスレッド共有メモリ情報ＩＤ５０１（図５参照）が"＃Ｔ２"であるスレッド共有メモリのスレッド共有メモリ使用量５０４"１２０"となる。
【０２６１】
総メモリ解放量２８０４は、スレッドＩＤ２８０１に示す複数スレッドを終了させた場合の総メモリ解放量である。この総メモリ解放量２８０４は、スレッド専有メモリ解放量２８０２とスレッド共有メモリ解放量２８０３の和として計算される。
【０２６２】
以上説明してきたように、本発明の実施の形態のメモリ使用量計算部３２４は、スレッドで実行している処理が任意の時点で実際に使用しているメモリ量を効率的、かつ、正確に計算することができる。
【０２６３】
[スレッドで実行している処理の制御]
【０２６４】
図２９は、本発明の実施の形態のメモリ不足発生時のスレッド制御処理の手順を示すフローチャートである。ＪａｖａＶＭ３２は、メモリ不足発生時に本処理を実行する。
【０２６５】
まずステップ２９０１において、ＪａｖａＶＭ３２は、メモリ使用量計算処理を実行する（Ｓ２９０１）。これにより、各スレッドのメモリ使用状況を取得する。メモリ使用量計算処理については、図８を参照して前述した通りである。
【０２６６】
次にステップ２９０２において、ＪａｖａＶＭ３２は、計算機システム１の制御ポリシーに基づいて、制御対象スレッドの候補を決定する（Ｓ２９０２）。なお、制御対象スレッドの候補は、制御ポリシーに応じて１つでもよいし、複数でもよい。また、制御ポリシーは、設定ファイル４２によって指定してもよいし、他の方法によって指定してもよい。
【０２６７】
その後ステップ２９０３において、ＪａｖａＶＭ３２は、設定ファイル４２に設定された情報に基づいて、ステップ２９０２で決定された制御対象スレッドの候補が、キャンセル（終了、取り消し）を許可されたスレッドか否かを判定する（Ｓ２９０３）。なお、設定ファイル４２では、キャンセルを許可するスレッドを、例えば「スレッドＸ」のように直接的に設定してもよいし、「メソッドＸを実行しているスレッド」のように間接的に設定してもよい。
【０２６８】
その後ステップ２９０４において、ＪａｖａＶＭ３２は、設定ファイル４２に設定された情報に基づいて、スレッドをキャンセルするための実行条件を満たしているか否かを判定する（Ｓ２９０４）。スレッドをキャンセルするための実行条件とは、例えば制御対象スレッドの候補をキャンセルすることによって解放されるメモリ量が所定閾値以上であるという条件である。
【０２６９】
ステップ２９０３においてＹＥＳ及びステップ２９０４においてＹＥＳの場合には、ＪａｖａＶＭ３２（メモリ使用量計算部３２４）は、スレッド制御部３２２に制御対象スレッドのキャンセルを要求し、スレッド制御部３２２は制御対象スレッドをキャンセルする（Ｓ２９０５）。
【０２７０】
その後ステップ２９０６において、ＪａｖａＶＭ３２は、ＧＣ実行部３２３にＧＣ実行を要求し、ＧＣ実行部３２３はＧＣを実行する（Ｓ２９０６）。これにより、不要なメモリ領域を解放する。
【０２７１】
その後ステップ２９０７において、ＪａｖａＶＭ３２は、メソッド実行を再開する（Ｓ２９０７）。一方、ステップ２９０３においてＮＯ、又は、ステップ２９０４においてＮＯの場合には、ＪａｖａＶＭ３２は、メモリ不足エラーを通知する（Ｓ２９０８）。
【０２７２】
以上に示す処理により、ＪａｖａＶＭ３２は、メモリ不足発生時に、メモリ不足の原因であるスレッドを特定してキャンセルし、不要なメモリをＧＣにより再利用可能にしている。これにより、メモリ不足によるＪａｖａＶＭ３２の停止を効率的に回避し、かつ、メソッド実行を継続することができる。
【０２７３】
なお、図２９では、制御対象がスレッドである場合について説明してきたが、この場合には限らない。制御対象は例えばスレッドで実行される処理でもよい。
【０２７４】
図３０は、本発明の実施の形態のメモリ使用量計算結果の出力例を示す図である。メモリ情報出力部３２５（図１参照）は、メモリ使用量計算部３２４による計算結果に基づいて、例えば出力画面３０００を生成し、ディスプレイ（出力装置６）に出力する。なお、ログデータとして出力してもよい。
【０２７５】
図３０に示す出力画面３０００は、図２７に示す各スレッドのメモリ使用量の計算結果に対応する。すなわち出力内容３００１、３００２及び３００３は、それぞれ各スレッドの専有メモリ使用量２７０２、共有メモリ使用量２７０３及び総メモリ使用量２７０４を、メモリ使用量に基づいて順位付けしてソートした情報である。
【０２７６】
なお、図３０において、変数"Ｒａｎｋ"は順位を示す。変数"ＴＩＤ"は、スレッドＩＤを示す。変数"Ｕｓａｇｅ"はメモリ使用量を示す。変数"Ｔｏｔａｌ Ｕｓａｇｅ"は、メモリ使用量の合計値を示す。変数"Ｎｕｍｂｅｒ ｏｆ Ｔｈｒｅａｄｓ"は、スレッドの数を示す。変数"Ａｖｅｒａｇｅ Ｕｓａｇｅ"は、メモリ使用量の平均値、すなわちスレッド１つ当りのメモリ使用量を示す。
【０２７７】
また、出力画面３０００では、各スレッドのメモリ使用量を示す情報（例えば出力情報３００４）が選択可能である。ユーザは入力装置５を用いて出力情報３００４を選択する（例えばマウスのクリック）。そうすると、メモリ情報出力部３２５は、選択された出力情報３００４に関する詳細な出力画面３１００（図３１参照）を生成し、ディスプレイに出力する。これにより、出力画面を遷移させる。出力画面３１００については、図３１を参照して後述する。
【０２７８】
図３１は、本発明の実施の形態のメモリ使用量計算結果の第１の詳細出力例を示す図である。
【０２７９】
図３１に示す出力画面３１００は、図３０で選択された出力情報３００４の詳細情報に係る出力画面である。ここでいう詳細情報とは、出力情報３００４に係るスレッド（ここでは、スレッドＩＤが"＃１"のスレッド）についてのフレーム専有メモリ情報である。すなわち出力内容３１０１及び３１０２は、それぞれフレーム専有メモリ情報ＩＤ３０１が"＃１"及び"＃２"のフレーム専有メモリ情報である。
【０２８０】
なお、図３１において、変数"ＦＰＭＩ ＩＤ"は、フレーム専有メモリ情報ＩＤ３０１を示す。変数"Ｍｅｔｈｏｄ ｎａｍｅ"は、メソッド名３０３を示す。変数"Ｕｓａｇｅ"は、フレーム専有メモリ使用量３０４を示す。変数"ＲＦＳＭＩ ＩＤ"は、参照先フレーム共有メモリ情報ＩＤ３０５を示す。変数"ＲＴＳＭＩ ＩＤ"は、参照先スレッド共有メモリ情報ＩＤ３０６を示す。
【０２８１】
また、出力画面３１００では、参照先スレッド共有メモリ情報ＩＤ３０６を示す情報（例えば出力情報３１０３）が選択可能である。ユーザは入力装置５を用いて出力情報３１０３を選択する。そうすると、メモリ情報出力部３２５は、選択された出力情報３１０３に関する詳細な出力画面３２００（図３２参照）を生成し、ディスプレイに出力する。出力画面３２００については、図３２を参照して後述する。
【０２８２】
図３２は、本発明の実施の形態のメモリ使用量計算結果の第２の詳細出力例を示す図である。
【０２８３】
図３２に示す出力画面３２００は、図３１で選択された出力情報３１０３の詳細情報に係る出力画面である。ここでいう詳細情報とは、出力情報３１０３に係る参照先スレッド共有メモリ情報ＩＤ（ここでは、"＃Ｔ１"）についてのスレッド共有メモリ情報である。すなわち出力内容３２０１は、スレッド共有メモリ情報ＩＤ５０１が"＃Ｔ１"のスレッド共有メモリ情報である。
【０２８４】
なお、図３２において、変数"ＴＳＭＩ＿ＩＤ"は、スレッド共有メモリ情報ＩＤ５０１を示す。変数"Ａｄｄｒｅｓｓ"は、アドレス５０２を示す。変数"Ｃｌａｓｓ ｎａｍｅ"は、クラス名５０３を示す。変数"Ｕｓａｇｅ"は、スレッド共有メモリ使用量５０４を示す。変数"ＲＦＳＭＩ＿ＩＤ"は、参照先フレーム共有メモリ情報ＩＤ５０５を示す。変数"ＲＴＳＭＩ＿ＩＤ"は、参照先スレッド共有メモリ情報ＩＤ５０６を示す。
【０２８５】
また、出力画面３２００では、参照先フレーム共有メモリ情報ＩＤ５０５を示す情報（例えば出力情報３２０２）及びアドレス５０２を示す情報（例えば出力情報３２０３）が選択可能である。ユーザは入力装置５を用いて出力情報３２０２、３２０３を選択する。そうすると、メモリ情報出力部３２５は、選択された出力情報３２０２、３２０３に関する詳細な出力画面３３００、３４００を生成し、ディスプレイに出力する。出力画面３３００、３４００については、それぞれ図３３、図３４を参照して後述する。
【０２８６】
図３３は、本発明の実施の形態のメモリ使用量計算結果の第３の詳細出力例を示す図である。
【０２８７】
図３３に示す出力画面３３００は、図３２で選択された出力情報３２０２の詳細情報に係る出力画面である。ここでいう詳細情報とは、出力情報３２０２に係る参照先フレーム共有メモリ情報ＩＤ（ここでは、"＃Ｆ２"）についてのフレーム共有メモリ情報である。すなわち出力内容３３０１は、フレーム共有メモリ情報ＩＤ４０１が"＃Ｆ２"のフレーム共有メモリ情報である。
【０２８８】
なお、図３３において、変数"ＦＳＭＩ＿ＩＤ"は、フレーム共有メモリ情報ＩＤ４０１を示す。変数"Ａｄｄｒｅｓｓ"は、アドレス４０２を示す。変数"Ｃｌａｓｓ ｎａｍｅ"は、クラス名４０３を示す。変数"Ｕｓａｇｅ"は、フレーム共有メモリ使用量４０４を示す。変数"ＲＦＳＭＩ＿ＩＤ"は、参照先フレーム共有メモリ情報ＩＤ４０５を示す。変数"ＲＴＳＭＩ＿ＩＤ"は、参照先スレッド共有メモリ情報ＩＤ４０６を示す。
【０２８９】
また、出力画面３３００では、クラス名を示す情報（例えば出力情報３３０２）が選択可能である。ユーザは入力装置５を用いて出力情報３３０２を選択する。そうすると、メモリ情報出力部３２５は、選択された出力情報３３０２に関する詳細な出力画面３５００（図３５参照）を生成し、ディスプレイに出力する。出力画面３５００については、図３５を用いて後述する。
【０２９０】
図３４は、本発明の実施の形態のメモリ使用量計算結果の第４の詳細出力例を示す図である。
【０２９１】
図３４に示す出力画面３４００は、図３２で選択された出力情報３２０３の詳細情報に係る出力画面である。ここでいう詳細情報とは、出力情報３２０３に係るアドレスに対するオブジェクト参照である。
【０２９２】
図３５は、本発明の実施の形態のメモリ使用量計算結果の第５の詳細出力例を示す図である。
【０２９３】
図３５に示す出力画面３５００は、図３３で選択された出力情報３３０２の詳細情報に係る出力画面である。ここでいう詳細情報とは、出力情報３３０２に係るクラス名に対するオブジェクト参照である。
【０２９４】
図３６は、本発明の実施の形態のメモリ解放量計算結果の出力例を示す図である。メモリ情報出力部３２５（図１参照）は、メモリ使用量計算部３２４による計算結果に基づいて、例えば出力画面３６００を生成し、ディスプレイ（出力装置６）に出力する。なお、ログデータとして出力してもよい。
【０２９５】
図３６に示す出力画面３６００は、図２８に示す各スレッドを終了させた場合のメモリ解放量の計算結果に対応する。すなわち出力内容３６０１、３６０２及び３６０３は、それぞれスレッドＩＤ２８０１で示す複数スレッドを終了させた場合のスレッド専有メモリ解放量２８０２、スレッド共有メモリ解放量２８０３及び総メモリ解放量２８０４を、メモリ解放量に基づいて順位付けしてソートした情報である。
【０２９６】
なお、図３０において、変数"Ｒａｎｋ"は順位を示す。変数"ＴＩＤ"は、スレッドＩＤを示す。変数"Ｒｅｌｅａｓｅ"はメモリ解放量を示す。変数"Ｔｏｔａｌ Ｒｅｌｅａｓｅ"は、メモリ解放量の合計値を示す。変数"Ｎｕｍｂｅｒ ｏｆ ｃｏｍｂｉｎａｔｉｏｎｓ"は、複数スレッドの組み合わせの数を示す。変数"Ａｖｅｒａｇｅ Ｒｅｌｅａｓｅ"は、メモリ解放量の平均値、すなわち複数スレッドの組み合わせ１つ当りのメモリ解放量を示す。
【０２９７】
以上説明してきたように、本発明の実施の形態のメモリ情報出力部３２５は、メモリ使用量計算部３２４の計算結果を出力することができる。これにより、計算結果を利用してスレッドを監視することができる。例えば、スレッドのメモリ使用量に応じて流量を制御できる。また、計算結果を利用してスレッドを制御することができる。例えば、メモリ使用量が多いスレッドを特定し、特定されたスレッドの実行をキャンセルすることによって、メモリを解放する。これにより、メモリ不足によるシステムの全体ダウンを効率的に抑止できる。
【０２９８】
なお、本発明の実施の形態では、本発明を、スレッドで実行している処理のメモリ使用量（メモリ解放量）の計算に適用した場合について説明してきたが、本発明はこの場合に限らず、これ以外の処理にも適用することができる。例えば、リソースのように参照関係を構築するものを利用する全ての処理に適用することができる。広義にはプログラムの処理を含み、狭義には、スレッドで実行している処理、プロセスで実行している処理及びＣＰＵで実行している処理等も含む。同様に、使用量（解放量）を計算するリソースとして、参照関係を構築するもの全てを適用することができる。広義には、データ構造、モジュール及びライブラリを含み、狭義にはオブジェクト、メモリ及びファイル（ディスクリプタ）等も含む。
【０２９９】
以上、本発明を添付の図面を参照して詳細に説明したが、本発明はこのような具体的構成に限定されるものではなく、添付した請求の範囲の趣旨内における様々な変更及び同等の構成を含むものである。
【図１】
0005525658.tif 000002
【図２】
0005525658.tif 000003
【図３】
0005525658.tif 000004
【図４】
0005525658.tif 000005
【図５】
0005525658.tif 000006
【図６】
0005525658.tif 000007
【図７】
0005525658.tif 000008
【図８】
0005525658.tif 000009
【図９】
0005525658.tif 000010
【図１０】
0005525658.tif 000011
【図１１】
0005525658.tif 000012
【図１２】
0005525658.tif 000013
【図１３】
0005525658.tif 000014
【図１４】
0005525658.tif 000015
【図１５】
0005525658.tif 000016
【図１６】
0005525658.tif 000017
【図１７】
0005525658.tif 000018
【図１８】
0005525658.tif 000019
【図１９】
0005525658.tif 000020
【図２０】
0005525658.tif 000021
【図２１】
0005525658.tif 000022
【図２２】
0005525658.tif 000023
【図２３】
0005525658.tif 000024
【図２４】
0005525658.tif 000025
【図２５】
0005525658.tif 000026
【図２６】
0005525658.tif 000027
【図２７】
0005525658.tif 000028
【図２８】
0005525658.tif 000029
【図２９】
0005525658.tif 000030
【図３０】
0005525658.tif 000031
【図３１】
0005525658.tif 000032
【図３２】
0005525658.tif 000033
【図３３】
0005525658.tif 000034
【図３４】
0005525658.tif 000035
【図３５】
0005525658.tif 000036
【図３６】
0005525658.tif 000037