(57)【特許請求の範囲】
【請求項１】
コンピュータ・ソフトウェアによる情報処理により、メモリの外部断片化の原因を決定するための方法であって、前記メモリの領域がアプリケーションにより解放され、アロケータにより割り当て解除され、いかなるアプリケーションにも再割り当てされず、前記方法が、
前記アプリケーションによる前記メモリの前記領域の解放に関連する情報を収集することと、
前記情報を前記メモリの前記領域に記憶することと、
を含み、
前記アプリケーションが１つまたは複数のオブジェクトの破壊に応答して前記メモリの前記領域を解放し、
前記情報が前記１つまたは複数のオブジェクトの前記破壊の原因に関連し、
前記情報が、前記メモリの前記領域を用いて満たすことができない割り当て要求、前記１つまたは複数のオブジェクトの作成と前記１つまたは複数のオブジェクトの破壊との間の時間の尺度、および前記１つまたは複数のオブジェクトの作成と前記１つまたは複数のオブジェクトの破壊との間に割り当てられる前記メモリの領域の数またはサイズのインジケータ、の１つまたは複数をさらに含み、
前記情報が、前記１つまたは複数のオブジェクトを作成させるコンピュータ可読プログラム・コードに関連付けられた識別子と、前記１つまたは複数のオブジェクトを破壊させるコンピュータ可読プログラム・コードに関連付けられた識別子とを含み、前記情報が、前記１つまたは複数のオブジェクトを作成させる前記コンピュータ可読プログラム・コードにおいて、前記１つまたは複数のオブジェクトが作成される場所を識別し、前記情報が、前記１つまたは複数のオブジェクトを破壊させる前記コンピュータ可読プログラム・コードにおいて、前記１つまたは複数のオブジェクトが破壊される場所を識別することと
を含む、方法。
【請求項２】
前記情報が、前記１つまたは複数のオブジェクトによりそれらの破壊時に解放される前記メモリの領域のそれぞれのサイズに関連する統計データをさらに含む、請求項１に記載の方法。
【請求項３】
前記情報の分析の結果を用いて、破壊される前記１つまたは複数のオブジェクトと類似した新たに作成されるオブジェクトに対して、前記新たに作成されるオブジェクトの他のものに前記メモリの領域を割り当てるために使用される前記メモリの第２の領域とは別である前記メモリの第１の領域から前記メモリの前記領域を割り当てること
をさらに含む、請求項１ないし２の何れかに記載の方法。
【請求項４】
請求項１−３の何れか１項に記載の方法の各ステップをコンピュータ・ハードウェアによる手段として構成した、システム。
【請求項５】
請求項１−３の何れか１項に記載の方法の各ステップをコンピュータに実行させる、コンピュータ・プログラム。
【請求項６】
請求項５に記載の前記コンピュータ・プログラムをコンピュータ可読記憶媒体に記憶した、コンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はメモリ管理に関し、より詳細にはメモリの外部断片化（externalfragmentation）の原因の決定に関する。
【背景技術】
【０００２】
ヒープなどのメモリ領域の断片化は、コンピュータ・システムにおける多くの性能の問題、たとえば長い実行時間およびより大きいメモリ要求を引き起こし得る。断片化を解消、回避または診断することは、コンピュータ・システムの動作に多大な利益があり得る。
【０００３】
外部断片化は、割り当て用に利用可能なメモリの空きチャンク（free chunk）（「ホール（hole）」）が、新たな「オブジェクト」の作成用であることが多い新たなメモリ割り当て要求を満たすのに小さすぎる場合である。本特許出願の文脈では、「オブジェクト」とは、データとそのデータに関連付けられた一意の識別子とを有するエンティティであって、その識別子がメモリ内のそのデータの位置であり得るエンティティである。オブジェクトは動的に割り当てられ、すなわち、そのデータを表すメモリの領域は、アプリケーションにより「アロケータ（allocator）」を介して割り当て、開放する（free）ことができる。本特許出願の文脈では、オブジェクトのデータがアプリケーションにより解放されて（release）いない場合に、オブジェクトは「生存（alive）」している。オブジェクトはアプリケーションにより「破壊（destroy）」することができ、すなわち、アプリケーションは、メモリを解放してフリーリスト（freelist）に戻すアロケータによってオブジェクトのデータを割り当て解除し（deallocate）、オブジェクトは「死亡（die）」する。典型的には、アロケータが割り当て要求を満たすのに十分大きいメモリ内のホールを発見できるまで、アロケータは、フリーリストとして知られているホールのリストを横断する必要がある。フリーリストの横断は実行時間がかかり、割り当てるには小さすぎるホールはメモリを浪費する。同じメモリ領域内に割り当てられた異なる寿命のオブジェクトが存在する場合に、外部断片化が生じることが多い。寿命の短いオブジェクトが死亡した場合、残存しているより寿命の長いオブジェクト間に残されたホールは、作成される新たなオブジェクトよりも小さいことが多い。ホールは集合的に外部断片化となる。ホールがフリーリストにおいてより小さく、より広範囲に及ぶほど、メモリはより断片化する。
【０００４】
以前の開示は、フリーリストを分析しフリーリストが多数の小さいホールからなるかを認識することによって、いつ外部断片化が発生するかを決定することができるが、以前の開示は、何がこれらのホールを発生させているか、どこでこれらのホールが発生したかを決定することができず、したがって以前の開示は、断片化を低減、回避または解消するために、どのコンピュータ可読プログラム命令が変更される必要があるかについて提案することができない。断片化、特に外部断片化の診断および回避を改善することが望ましいであろう。
【発明の概要】
【発明が解決しようとする課題】
【０００５】
したがって、当技術分野において、上述の問題に対処する必要がある。すなわちメモリの外部断片化の原因の決定を行うための手段を提供することである。
【課題を解決するための手段】
【０００６】
さらなる態様から見ると、本発明は、メモリの外部断片化の原因を決定するための方法を提供し、ここでは、メモリの領域がアプリケーションにより解放され、アロケータにより割り当て解除され、いかなるアプリケーションにも再割り当てされず、方法は、アプリケーションによるメモリの領域の解放に関連する情報を収集することと、情報をメモリの領域に記憶することと、情報を分析してメモリの領域がいかなるアプリケーションにも再割り当てされなかった理由を決定することとを含む。
【０００７】
さらなる態様から見ると、本発明は、メモリの外部断片化の原因を決定するためのシステムを提供し、ここでは、メモリの領域がアプリケーションにより解放され、アロケータにより割り当て解除され、いかなるアプリケーションにも再割り当てされず、システムは、アプリケーションによるメモリの領域の解放に関連する情報を収集し、情報をメモリの領域に記憶するためのアロケータと、情報を分析してメモリの領域がいかなるアプリケーションにも再割り当てされない理由を決定するためのアナライザとを備える。
【０００８】
さらなる態様から見ると、本発明は、メモリの外部断片化の原因を決定するためのコンピュータ・プログラム製品を提供し、ここでは、メモリの領域がアプリケーションにより解放され、アロケータにより割り当て解除され、いかなるアプリケーションにも再割り当てされず、コンピュータ・プログラム製品は、処理回路により読み取り可能であって、処理回路により実行して本発明のステップを実施するための方法を実施するための命令を記憶するコンピュータ可読記憶媒体を備える。
【０００９】
さらなる態様から見ると、本発明は、コンピュータ可読媒体に記憶され、デジタル・コンピュータの内部メモリにロード可能なコンピュータ・プログラムであって、前記プログラムをコンピュータ上で動作させた場合に、本発明のステップを実施するためのソフトウェア・コード部分を備える、コンピュータ・プログラムを提供する。
【００１０】
本発明の実施形態は、メモリの外部断片化の原因を決定するための方法であって、メモリの領域がアプリケーションにより解放され、アロケータにより割り当て解除され、いかなるアプリケーションにも再割り当てされない、方法を提供する。方法は、アプリケーションによるメモリの領域の解放に関連する情報を収集することを含む。方法は、情報をメモリの領域に記憶することをさらに含む。方法は、情報を分析してメモリの領域がいかなるアプリケーションにも再割り当てされなかった理由を決定することをさらに含む。
【００１１】
本発明の実施形態は、メモリの外部断片化の原因を決定するための方法であって、メモリの領域の第１の部分がアロケータによりアプリケーションに割り当てられ、メモリの領域の第２の部分がアロケータにより解放される、方法をさらに提供する。方法は、第２の部分が残りの部分であることを示すインジケータをメモリの領域の第２の部分に記憶することを含む。方法は、第２の部分の解放に関連する情報を収集することをさらに含む。方法は、情報を第２の部分に記憶することをさらに含む。方法は、情報を分析して第２の部分がいかなるアプリケーションにも再割り当てされない理由を決定することをさらに含む。
【００１２】
本発明の実施形態は、メモリの外部断片化の原因を決定するためのシステムであって、メモリの領域がアプリケーションにより解放され、アロケータにより割り当て解除され、いかなるアプリケーションにも再割り当てされない、システムをさらに提供する。システムはアロケータを含む。アロケータは、アプリケーションによるメモリの領域の解放に関連する情報を収集し、情報をメモリの領域に記憶する。システムは、情報を分析してメモリの領域がいかなるアプリケーションにも再割り当てされない理由を決定するためのアナライザをさらに含む。システムでは、メモリの領域は、アロケータにより割り当て解除され、いかなるアプリケーションにも再割り当てされない。
【００１３】
本発明の実施形態は、メモリの外部断片化の原因を決定するためのコンピュータ・プログラム製品であって、メモリの領域がアプリケーションにより解放され、アロケータにより割り当て解除され、いかなるアプリケーションにも再割り当てされない、コンピュータ・プログラム製品をさらに提供する。コンピュータ・プログラム製品は、プログラム・コードを具現化したコンピュータ可読記憶媒体を備える。プログラム・コードは、アプリケーションによるメモリの領域の解放に関連する情報を収集し、情報をメモリの領域に記憶し、情報を分析してメモリの領域がいかなるアプリケーションにも再割り当てされなかった理由を決定するように実行可能である。
【００１４】
本発明の実施形態は、メモリの外部断片化の原因を決定するためのコンピュータ・プログラム製品であって、メモリの領域の第１の部分がアロケータによりアプリケーションに割り当てられ、メモリの領域の第２の部分がアロケータにより解放される、コンピュータ・プログラム製品をさらに提供する。コンピュータ・プログラム製品は、プログラム・コードを具現化したコンピュータ可読記憶媒体を備える。プログラム・コードは、第２の部分が残りの部分であることを示すインジケータをメモリの領域の第２の部分に記憶し、第２の部分の解放に関連する情報を収集し、情報を第２の部分に記憶し、情報を分析して第２の部分がいかなるアプリケーションにも再割り当てされない理由を決定するように実行可能である。
【００１５】
以下、本発明が例示のみを目的として、以下の図面に示された好ましい実施形態を参照しながら説明される。
【図面の簡単な説明】
【００１６】
【図１】従来技術による、メモリの割り当て済みチャンクおよびメモリの空きホール（freehole）を有する従来技術のメモリ管理システムの図である。
【図２】従来技術による、図１のメモリの空きホールの従来技術のフリーリストの図である。
【図３】従来技術による、図１のメモリの従来技術の空きホールの図である。
【図４】従来技術による、図１のメモリの従来技術の割り当て済みチャンクの図である。
【図５】本発明の好ましい一実施形態による、何がまたは誰があるいは何および誰が外部断片化を発生させているかを決定する本発明による方法の第１の実施形態のフローチャートである。
【図６】本発明の好ましい一実施形態による、図３のメモリの空きホールならびに図５の実施形態によりそこに記憶された情報の図である。
【図７】本発明の好ましい一実施形態による、図５の実施形態により収集された情報に基づいて保持される統計的指標（statistical metric）のセットの図である。
【図８】本発明の好ましい一実施形態による、図５の分析ステップ５１０のフローチャートである。
【図９】本発明の好ましい一実施形態による、何がまたは誰があるいは何および誰が外部断片化を発生させているかを決定する本発明による方法の第２の実施形態のフローチャートである。
【発明を実施するための形態】
【００１７】
図１は、本発明の実施形態が実装され得る、メモリの割り当て済みチャンクおよびメモリの空きホールを有する従来技術のメモリ管理システムを示す。アプリケーション１３０、１３２は、使用のために、メモリ１０２の領域からメモリの領域１０４、１０６が割り当てられるようにアロケータ１３６に要求を行う。そのような要求は、allocまたはmallocなどのコマンドを用いて行うことができる。アロケータ１３６は、アプリケーション１３０、１３２が使用するために要求通りにメモリ１０２の領域１０４、１０６を割り当てる。また、図１は、図１に示されていないアプリケーションに割り当てられたメモリ１０２の他の領域１０８〜１１２を示す。各アプリケーション１３０、１３２は、メモリ１０２の領域１０４〜１１２が割り当てられるようにアロケータ１３６に複数の要求を行うことができ、アプリケーション１３０、１３２に割り当てられたメモリ１０２の領域１０４〜１１２は必ずしも連続していない。アプリケーション１３０、１３２は、メモリ１０２の領域１０４〜１１２を使用し終えた場合、freeまたはdeallocなどのコマンドを用いてメモリ１０２の領域１０４〜１１２をアロケータ１３６に返す（「解放する」または「開放する」）。メモリ１０２の領域１０４〜１１２がアロケータ１３６に解放された場合、メモリ１０２の未割り当て領域１２２〜１２８のフリーリスト１３４に追加する。従来技術のフリーリスト１３４は、後で図２ないし４を参照して説明される。
【００１８】
メモリ１０２のメモリ領域１０４〜１１２、１２２〜１２８を割り当てるおよび開放するいくつかの要求が処理された場合、最初の長い連続した空きメモリ領域は、徐々に小さい領域１２２〜１２８へと断片化する。外部断片化は、アプリケーション１３０、１３２に割り当てられたメモリ１０２の割り当て済み領域１０４〜１１２の間の空き領域１２２〜１２８が、メモリ１０２から割り当てる新たな要求を満たすには小さすぎる場合である。外部断片化の一つの尺度は、フリーリスト上の多数の小さいホールであって、割り当て要求を満たすには小さすぎるホールのために、割り当て用に使用できないメモリの割合であり、外部断片化の他の尺度は、多数の小さいホールへの遭遇によるフリーリストの横断の増加したコストである。
【００１９】
０％の外部メモリ断片化が意味するのは、空きメモリの全てが、メモリ使用量または計算労力の追加コストなしで割り当て可能であるということである。（メモリ使用量尺度の下での）９０％の外部メモリ断片化が意味するのは、アロケータがたとえば８００ＫＢのサイズのメモリ１０２の領域を有しているが、７２０ＫＢが小さいサイズのホールのために割り当てに使用できないということである。
【００２０】
図２は、図１のメモリの空きホールの従来技術のフリーリストを示す。メモリ１０２の空き領域１２２〜１２８は、メモリの各空き領域１２２〜１２８内のメモリ領域をメモリの次の空き領域１２２〜１２８へのポインタとして用いることで、リンク・リストにおいて共に接続される。変数は、メモリ１０２の第１の領域１２２への参照を含む。メモリの最後の領域１２８は、リンク・リストの終端を示すターミネータ値（terminator value）、通常は「ＮＵＬＬ」を含む。メモリ１０２の新たな領域１２８を開放するために、それへのポインタが、リンク・リスト内のメモリ１０２の最後の空き領域１２６に単純に配置される。メモリ１０２の領域１２６を割り当てるために、メモリ１０２の次の空き領域１２８へのポインタが、メモリ１０２の空き領域１２４に単純にコピーされ、これはフリーリスト１３４から除去され割り当てられるメモリ１０２の領域１２６を指す既存のポインタを上書きすることで行われる。
【００２１】
アロケータ１３６は、それ自体が、メモリ１０２の空き領域１２２〜１２８を作成することができる。これが発生し得るのは、たとえば５６バイトのサイズのメモリ１０２のブロックがアプリケーション１３０、１３２により要求され、アロケータ１３６が６４バイトのサイズのブロックしか発見できなかった場合である。アロケータ１３６は、たとえば５６バイトの第１の部分をアプリケーション１３０、１３２に割り当て、６４バイトのサイズのブロックの残りの第２の部分から空きメモリ１０２の８バイトのブロックを作成し、フリーリスト１３４にリンクする。アロケータは、アロケータにより解放されたメモリの領域の第２の部分に、メモリの領域の第２の部分が残りの部分であることを示すインジケータを記憶する。
【００２２】
図３は、図１のメモリの従来技術の空きホールを示す。メモリ１０２の例示的な従来技術の空きホール１２４は、メモリ・ホール１２４のサイズの表示３０４を含む。典型的には、最上位ビット３０２を用いて、メモリ１０２の関連付けられた領域がメモリ１０２の空きホール１２４であるか、またはメモリ１０２の割り当て済みチャンク１０６であるかが示される。他の従来技術では、空き／割り当て済みビット３０２は、サイズの表示３０４とは別である。他の実装では、メモリの各ブロックが空きか割り当て済みかを示すメモリの各ブロック用のビットを有するマーク・マップが使用される。たとえば、空きメモリを示すマーク・マップ内の３つの隣接するビットが存在する場合、空いている３つの連続したメモリ・ブロックが存在する。他の実装では、メモリ・ホールのサイズはコンテキストにより決定される。アロケータ１３６はいくつかの別個のフリーリスト１３４を保持し、各フリーリスト１３４は単一の所与のサイズのメモリ１０２の領域１２２〜１２８を含む。メモリの領域のサイズを記憶するこれらの実装のいずれが用いられても、アロケータはそれを用いてサイズを記録することによって、従来の割り当てを実施できるようにする。
【００２３】
次のポインタ３０６は、図２を参照して上記で説明されたように、フリーリスト１３４内の空きメモリ１０２の次の領域１２６を指す。空きメモリの各領域内の次のポインタ３０６は、空きメモリ領域１２２〜１２８のリンク・リストを形成する。空きメモリ３１０は、メモリ１０２の空きホール１２４の残りの部分を形成する。
【００２４】
図４は、図１のメモリの従来技術の割り当て済みチャンクを示す。メモリ１０２の例示的な従来技術の割り当て済みチャンク１０６は、メモリ・チャンク１０６のサイズの表示４０４を含む。典型的には、最上位ビット４０２を用いて、メモリの関連付けられた領域がメモリ１０２の空きホール１２４であるか、またはメモリ１０２の割り当て済みチャンク１０６であるかが示される。他の従来技術では、空き／割り当て済みビット４０２は、サイズの表示４０４とは別である。空きチャンク１２４に見られる次のポインタ３０６は、割り当て済みメモリ１０４〜１１２には必要なく、その理由は割り当て済みメモリのリンク・リストが存在しないためである。割り当て済みメモリ４１０は、メモリ１０２の割り当て済みチャンク１０６の残りの部分を形成する。
【００２５】
図５は、何がまたは誰があるいは何および誰が外部断片化を発生させているかを決定する本発明による方法の第１の実施形態のフローチャートを示す。方法はステップ５０２から開始する。ステップ５０４において、「呼び出し元（caller）」と呼ばれるアプリケーション１３０、１３２のメソッド、たとえばルーチン、関数などは、もはや必要ないオブジェクトを破壊することを望む。呼び出し元は、オブジェクトに以前割り当てられていたメモリの領域を開放するために、アロケータ１３６の割り当て解除関数を呼び出す。アロケータ１３６は、図２を参照して上記で説明されたように、メモリの領域をフリーリストに挿入する。ステップ５０６において、オブジェクトに以前割り当てられていたメモリの領域の解放に関連する情報が収集される。収集される情報は、１つのオブジェクトの破壊の原因に関し得る。他の実施形態では、収集される情報は２つ以上のオブジェクトに関し得る。記憶される情報（図６の６０２〜６０８）は純粋に例示的であり、図示された情報６０２〜６０８ならびに図示されない他の情報の一部または全部を含んでもよく、いずれも含まなくてもよい。メモリ１０２の空き領域１２２で利用可能な十分な空間がない場合、情報６０２〜６０８の全てが記憶されなくてもよい。記憶される情報６０２〜６０８は、メモリ１０２の領域１２２を以前所有していたオブジェクトを誰が作成または破壊したか、またはメモリ１０２の領域１２２を以前所有していたオブジェクトがどこで作成または破壊されたかに関する。
【００２６】
図６を参照すると、記憶される情報は、オブジェクトを破壊してメモリ１０２の領域１０４〜１１２を開放したまたは割り当て解除した呼び出し元の復帰アドレス（return address）６０２を含むことができ、復帰アドレス６０２を用いて呼び出し元自体を識別することができる。この復帰アドレスは、アロケータ１３６が現在のスレッド用のコール・スタックをウォーク（walk）することによって取得することができる。従来のスタック・ウォーカが、使用されている言語およびプラットフォームに対して使用される。呼び出し元に戻る復帰アドレスが発見されるまで、スタックがウォークされる。アロケータ１３６の割り当て解除メソッドへの１つまたは複数のエントリ・ポイントが明確に定義されているので、現在のスレッド用のコール・スタック内の復帰アドレスの位置を決定することができる。
【００２７】
記憶される情報は、オブジェクトの作成または破壊あるいはその両方が行われたときの、行番号６０４、ファイル名ＩＤ６０６およびメソッドＩＤ６０８をさらに含むことができる。これらはそれぞれ、deallocate、deallocまたはfreeコマンドへのパラメータとしてアロケータ１３６に渡されることによって、取得することができる。Ｃ＋＋言語で実装される一実施形態では、_FILE_、_LINE_および_func_（または_FUNCTION_）は、典型的には、コンパイル時に現在のフル・パスおよびファイル名、現在の行番号および現在の関数名をそれぞれ与える変数にビルドされる。たとえば、従来のfreeコマンドはdeallocate（Pointer1）であり得、これは変数*Pointer1が指すオブジェクトに割り当てられたメモリを廃棄するものである。本発明の実施形態では、deallocateコマンドはdeallocate(Pointer1,102,"ClassA::methodA")であり得、これは行番号１０２の関数「ClassA::methodA」が、変数*Pointer1が指すオブジェクトに割り当てられたメモリを廃棄するものである。他の実施形態では、行番号の代わりに、ソース・ファイルのステートメント番号をパラメータとして使用することができる。名称をＩＤで参照される文字列として記憶するハッシュ・テーブルを用いることで、名称をより短いＩＤに変換してファイル名ＩＤ６０６およびメソッドＩＤ６０８として記憶することができる。後で、事後処理の際に、ＩＤが与えられると、ハッシュ・テーブルを用いて、関連付けられた文字列を検索することができる。
【００２８】
他の実施形態では、オブジェクトが「生存」しているのは、アプリケーションあるいは１つまたは複数の他の生存オブジェクト（live object）がそのオブジェクトへの参照を保持している場合である。オブジェクトが死亡するのは、全ての生存オブジェクトおよびアプリケーションからのそのオブジェクトへの全ての参照が除去された場合である。最後の参照が除去された場合、オブジェクトは破壊され、これを生じさせたアプリケーション関数を、従来技術の参照カウンティング（reference counting）の方法によって決定することができる。参照カウンティングとは、オブジェクトに対する参照、ポインタまたはハンドルの数を記憶する技法である。この実施形態では、アロケータは、オブジェクト自体に関連する、またはオブジェクト自体における参照カウントを記憶する。アプリケーションはアロケータのメソッドを用いて、オブジェクトへの参照およびオブジェクト間の参照を追加または除去する。アプリケーション関数がアロケータのメソッドによってオブジェクトへの最後の参照を除去した場合、オブジェクトの参照カウントはゼロに減少することになり、オブジェクトはその時点で死亡していることが知られ、アロケータはたった今死亡したオブジェクトに関連付けられたメモリを割り当て解除することになる。この正確な時点で、アロケータはオブジェクトを破壊させた関数を決定することができる。前述のように、アロケータは、アロケータの参照除去メソッドへのエントリ・ポイントに到達するまで、コール・スタックをウォークし得る。関数の復帰アドレスを決定することができる。または同様の方法で、現在のファイル名、現在の行番号および関数の現在の関数名を含む追加のパラメータを参照除去メソッドに渡すことができる。
【００２９】
本発明の実施形態では、さらなる情報はメモリ１０２の空き領域１２２に記憶することができ、（ｉ）メモリ１０２の空き領域１２２が要求を満たさなかったフリーリスト１３４への割り当て要求の数「N_not_sat」、（ｉｉ）オブジェクトが作成されてから破壊されるまでの経過／ＣＰＵ時間、（ｉｉｉ）メモリ１０２の領域１２２を以前所有していたオブジェクトが生存している間に発生した割り当て要求の数または割り当て要求の合計サイズ、（ｉｖ）オブジェクトを破壊させた関数のスレッドＩＤまたはモジュールＩＤなどの他の情報を含むがこれらに限定されない。
【００３０】
各空きメモリ領域１２２〜１２８は、その特定のメモリ領域に関連する上記の情報、および１つまたは複数のオブジェクトの破壊の原因の全部または一部を含むかあるいはいずれも含まない。メモリ１０２の空き領域１２２〜１２８が要求を満たさなかったフリーリスト１３４への割り当て要求の数「N_not_sat」は、本発明の実施形態が、フリーリスト１３４に最近追加されたメモリ１０２の空き領域１２２〜１２８を、長時間フリーリスト１３４上にあり「有益」ではないメモリ１０２の空き領域１２２〜１２８、すなわち割り当て要求を満たせなかったメモリ１０２の空き領域１２２〜１２８と区別することが可能になるので有益である。割り当て要求の数「N_not_sat」は、他の情報６０２〜６０８と共に記憶されるカウンタであって、メモリ領域１２２〜１２８のそれぞれがアロケータ１３６により割り当て要求について検査されるが、割り当てに使用されない度にインクリメントされるカウンタとして実装することができる。
【００３１】
オブジェクトが作成されてから破壊されるまでの経過時間またはＣＰＵ時間は有益であり、その理由は、寿命の短いオブジェクトとして知られている、短い経過時間または短いＣＰＵ時間しか存続しなかったオブジェクトに以前割り当てられていたメモリ１０２の空き領域１２２〜１２８が、より多くのホールを発生させる種類のオブジェクトであるためである。オブジェクトが作成された開始時刻は、メモリ領域１２２がオブジェクトに割り当てられるときに他の情報と共に記憶することができる。オブジェクトが破壊される時刻は、オブジェクトが割り当て解除されるときに既知となる。これら２つの時刻の差は、オブジェクトが生存していた時間の長さ、すなわち経過時間またはＣＰＵ時間あるいはその両方である。
【００３２】
オブジェクトが作成されてから破壊されるまでのメモリの割り当ての数またはメモリの割り当ての合計サイズの増加は、オブジェクトが寿命の短いオブジェクトまたは寿命の長いオブジェクトのいずれであるかの他の尺度である。オブジェクトが作成されるまでに行われた割り当ての数は、メモリ領域１２２がオブジェクトに割り当てられるときに、他の情報と共に記憶することができる。オブジェクトが破壊されるまでに行われた割り当ての数は、オブジェクトが割り当て解除されるときに既知となる。これら２つの数の差は、オブジェクトが生存していた間に行われたメモリの割り当ての数である。
【００３３】
アロケータ１３６は、メモリをアプリケーション１３０、１３２に割り当てようとする場合、フリーリスト１３４において、割り当てる適切なサイズのメモリ領域１２２〜１２８を検索する。そのようなメモリ領域を発見した場合、メモリ領域は、要求された割り当てサイズよりもはるかに大きい場合がある。アロケータ１３６は、メモリ領域の一部を割り当てて、メモリ領域の残りをフリーリスト１３４に挿入する。これを行うために、メモリ領域を２つの部分に分割して、２つのオブジェクト、すなわち割り当てオブジェクトおよび残余オブジェクト（remnant object）を作成する。割り当てオブジェクトは、割り当て要求を満たすためにアプリケーションに返される。残余オブジェクトはフリーリスト１３４に挿入され、したがって直ちに「死亡」する。本発明の一実施形態では、メモリの空き領域で利用可能な空間の量に応じて、アロケータ１３６がこれを行う場合、アロケータ１３６は、フリーリスト１３４への残余の解放に関連するアロケータ１３６の「残り挿入」アクションを示す専用のメソッドＩＤを（メモリの空き領域１２２に）記録する。同様に、メモリ領域が合体される場合、アロケータ１３６は、アロケータ１３６の合体アクションを示す専用のメソッドＩＤを記録する。同様に、１つの合体したオブジェクトは、合体された２つ以上のメモリ領域から作成され、その合体したオブジェクトは直ちに「死亡」し、フリーリスト１３４に挿入し戻される。専用のメソッドＩＤが以前のメソッドＩＤ６０８を上書きすることができ、または専用のメソッドＩＤをそのメモリ領域１２２についての以前のメソッドＩＤ６０８に付加することができ、それによってホールの元の原因に関する情報がデータ分析時にまだ利用可能であることに留意されたい。
【００３４】
図５に戻ると、ステップ５０８において、ステップ５０６で収集された情報は、開放されているメモリ領域１２２であって、以前は割り当てられていたが現在は空いているメモリ領域１２２を所有していた、現在は破壊されたオブジェクトに以前関連付けられていたメモリ領域１２２に記憶される。図６を簡単に参照すると、これは、図３のメモリ１０２の空きホール１２２ならびに図５の実施形態のステップ５０８によりそこに記憶された情報６０２〜６０８を示す。
【００３５】
ステップ５１０において、収集された情報を分析して、メモリ１０２の１つまたは複数の領域１２２〜１２８がいかなるアプリケーションにも再割り当てされなかった理由を決定する。そのような分析は、たとえば、これらのオブジェクトを誰が作成し誰が破壊させたか、またはこれらのオブジェクトがどこで作成されたかもしくはどこで破壊されたかあるいはその両方の統計プロファイルを収集することであってよい。そのような統計プロファイルは、領域１２２〜１２８のサイズのカテゴリについての空き領域１２２〜１２８の数を示すヒストグラムとすることができる。これが示し得るのは、割り当てることができなかったメモリ１０２の空き領域１２２〜１２８のほとんどが、メモリ１０２の割り当て済み領域の間の小さいホールを備えていたということである。その場合、これらのオブジェクトを作成するまたは破壊させるあるいはその両方を行うメソッドのソース・コードを調査して、作成されたオブジェクトの種類、寿命が短かった理由を決定し、外部断片化を回避するための他の手段を決定することができる。
【００３６】
本発明の一実施形態では、診断ツールの一部として、メモリ１０２の空き領域１２２〜１２８に記憶された収集された情報は、（ｉ）要求が分析者により行われる場合（その場分析（in situ analysis））、または（ｉｉ）アプリケーションが終了した場合（事後分析）に分析することができる。
【００３７】
本発明の一実施形態では、適応的アロケータ１３６の一部として、メモリ１０２の空き領域１２２〜１２８に記憶された収集された情報は、アロケータが修正アクションを行うと決定した場合に分析することができる。
【００３８】
図７を参照すると、（ファイル名、メソッド、関数、もしくはルーチン名、または行番号あるいはこれらの組合せにより決定される）呼び出し元ＩＤごとに、統計的指標７００のセットが、収集された情報に基づいて保持される。例示的実施形態では、その呼び出し元ＩＤに関連付けられたメモリ領域１２２〜１２８の数のカウント７０２、空きメモリ領域１２２〜１２８のサイズの平均値７０４、または空きメモリ領域１２２〜１２８のサイズのヒストグラム７０６が、データ収集中に記録されるその呼び出し元のインジケータを含むフリーリスト１３４について保持される。
【００３９】
各呼び出し元ＩＤは統計的指標７００のセットと関連付けられ、統計的指標のセットを記憶し検索することができ、これはたとえば、当業者にはよく知られているように、呼び出し元ＩＤをハッシュ・テーブルのキーとして用いることで行う。指標７００のセットに保持される他の統計的指標が存在し得、たとえば、呼び出し元ＩＤに関連付けられた全てのメモリ領域１２２〜１２８にわたる全ての満たされていない割り当て要求の総カウント７０８、ＣＰＵまたは経過時間の単位での、呼び出し元ＩＤに関連付けられた、生存時に破壊されたオブジェクトの平均寿命７１０、寿命中にアプリケーションが行った割り当て数の単位でのオブジェクトの平均寿命７１２、またはアプリケーションが割り当てたバイト数の単位でのオブジェクトの平均寿命７１４などがある。指標７０２〜７１４は全てが存在してもよく、任意の組合せで存在してもよく、またはいずれか１つのみが存在してもよい。
【００４０】
図８は、図５の分析ステップ５１０の一実施形態のフローチャートを示す。方法はステップ８０２から開始する。統計的指標７００は、フリーリスト１３４を検査することで生成される。ステップ８０４において、フリーリスト１３４上のメモリ領域１２２〜１２８ごとに、呼び出し元ＩＤが最初に識別される。呼び出し元ＩＤは、メソッドＩＤ、スレッドＩＤ、モジュールＩＤ、行番号、ファイル名ＩＤまたはメソッド内の復帰アドレスのうちの１つまたは複数であり、これは、オブジェクト・ファイルまたは別の「デバッグ情報」ファイルに書き込まれ得るシンボル情報からの呼び出し元メソッドＩＤまたは行番号あるいはその両方にマッピングすることができる。シンボル情報からの呼び出し元ＩＤのマッピングは、当業者にはよく知られている。
【００４１】
ステップ８０６において、その呼び出し元ＩＤについて計算された統計的指標７００のセットが検索され、検査中の現在のメモリ領域についての収集された情報によって更新される。たとえば、呼び出し元ＩＤに関連付けられたメモリ領域１２２〜１２８の数のカウント７０２を更新することができ、呼び出し元ＩＤについてのメモリ領域のサイズの平均値７０４を、メモリ領域１２２に記憶されたものからの既知のサイズ３０４を用いて更新することができ、または呼び出し元ＩＤについてのメモリ領域のサイズのヒストグラム７０６を、既知のサイズ３０４を用いて更新することができ、あるいはそれらの組合せを行うことができる。
【００４２】
ステップ８０８において、他の統計的指標７０８〜７１４を、その呼び出し元ＩＤについて更新することができる。たとえば、その呼び出し元ＩＤについての満たされていない割り当て要求７０８の総数を、検査中のメモリ領域についての満たされていない割り当て要求の数「N_not_sat」に基づいて更新することができる。また、一例として、その呼び出し元ＩＤについての生存時に破壊されたオブジェクトのＣＰＵまたは経過時間の単位での平均寿命７１０を、メモリ領域に関連付けられたオブジェクトが生存していたときのＣＰＵまたは経過時間での期間を用いて更新することができる。方法はステップ８１０において終了する。
【００４３】
取得可能な多数の異なる統計的指標が存在し得、上記はそれらの選択を与えるにすぎないことは理解されよう。また、指標のいくつかは、呼び出し元ＩＤが階層的な性質を有するので、階層的な情報につながり得る。たとえば、結果の統計量は、メソッドが内部に存在するモジュールごとに、次いでメソッド内で、次いで行番号において、起こることを示すことができる。この情報は、ソース・コードで補足することができる。
【００４４】
統計データは、（ｉ）情報を用いてアロケータ１３６の挙動を修正する適応的アロケータ１３６の一部であるシステムの他のコンポーネントに渡されるか、または（ｉｉ）情報を用いて診断レポートを性能分析者に出力するプロファイリング・ツールに渡され、性能分析者はレポートを用いて断片化を低減させるようにアプリケーションまたはアロケータを変更する。データのリッチなビューを示すように統計量が視覚化され得る方法に関して多くの従来技術が存在する（たとえば、SourceForgeから入手可能なPerformance  Inspector、インテル社から入手可能なvtune、またはSourceForgeから入手可能なoprofile）。
【００４５】
上記の（ｉｉ）のそのような診断レポートがどのように見え得るかの一例が、以下にＣ＋＋言語に対して示されている。断片化の原因の特定、たとえば断片化を生成するオブジェクト「ｏｂｊＡ」も識別するClassA::methodAの１０行目などは、本発明の実施形態の重要な利点である。
満たされていない要求
ラベル  カウント  ％％％  名称
TID  137254  94.49  Thread_A
MOD  100761  69.37  Module_A
SYM  22122  15.23  ClassA::methodA()
LIN  14685  10.11  line 10:Allocator::deallocate(objA);
LIN  6703  4.61   line 40 :Allocator::deallocate(objC);
...
SYM  14097  9.71  ClassB::methodE()
...
MOD  35719  24.59  Module_B
ホールのサイズ＜１６バイト
ラベル  カウント  ％％％  名称
TID  3993  89.07  Thread_A
MOD  2636  58.80  Module_A
SYM  1523  33.97  ClassA::methodA()
LIN  1278  28.51   line 10:Allocator::deallocate(objA);
LIN  107  2.39   line 40:Allocator::deallocate(objC);
...
SYM  1024  22.84  ClassB::methodE()
...
MOD  1241  27.68  Module_B
ここで、
ラベル−イベントが発生した階層レベル：
ＴＩＤ−スレッド・レベル
ＭＯＤ−モジュール・レベル
ＳＹＭ−シンボル・レベル
ＬＩＮ−行番号
カウント−所与のレポート指標のカウント（たとえば、満たされていない要求、サイズ＜１６バイトのホール）
％％％−このシンボル内のこの指標の割合（パーセンテージで）
名称−シンボル名（すなわち、スレッドｉｄ名、モジュール名、メソッド名、行番号およびその行のソース・コード）
【００４６】
ステップ５１２において、調査の結果を用いて、外部断片化の原因を回避するようにメモリの割り当てを変更することができる。アロケータはステップ５１０の結果を用いて、外部断片化を発生させる種類のオブジェクトをより良く割り当てる。方法はステップ５１４において終了する。
【００４７】
図９は、何がまたは誰があるいは何および誰が外部断片化を発生させているかを決定する本発明による方法の第２の実施形態のフローチャートを示す。ステップ５０２ないし５１０は、図５を参照して上記で説明済みのものと同一である。ステップ９１２において、ステップ５１０の収集された情報の分析の結果を用いて、破壊された１つまたは複数のオブジェクトと類似した新たに作成されるオブジェクトに対して、第１のメモリ領域からメモリ１０２の領域を割り当てる。第１のメモリ領域は、新たに作成されるオブジェクトの他のものにメモリ領域を割り当てるために使用される第２のメモリ領域とは別である。この実施形態では、データ分析によって、第１のアプリケーションまたは特定の第１のメソッドが小さいメモリ領域を要求しその後解放することによってデフラグを発生させることが多いが、第２のアプリケーションまたは特定の第２のメソッドがはるかに大きいメモリ領域を要求しその後解放すると決定された場合、第１のアプリケーションおよび第２のアプリケーションからの要求を、別々のメモリ領域から割り当てることができる。方法はステップ９１４において終了する。一実施形態では、第１のメモリ領域内の新たに作成されるオブジェクトは、典型的には大きいオブジェクトである第２のメモリ領域内の新たに作成されるオブジェクトとは異なるサイズのもの、典型的には小さいオブジェクトである。
【００４８】
本発明の実施形態は、いつどこでオブジェクトが死亡するかの知識を必要とするので、死亡する場所は、プログラム・ソース内で明確に定義され明示的である必要がある。たとえば、自動メモリ管理、たとえばＩＢＭ（Ｒ）のＪａｖａ（Ｒ）仮装マシンのガベージ・コレクタについて、プログラムはいつオブジェクトが死亡するかを暗黙的にしか決定せず、これは（主に）オブジェクトが生存オブジェクトによりもはや参照されない場合に行われる。したがって、死亡したオブジェクトがガベージ・コレクションでしか発見されないので、「誰が」オブジェクトを破壊したかを決定することができない。そのような実施形態では、ガベージ・コレクタが参照カウンティングを利用する場合、これを用いていつオブジェクトが死亡するかを決定することができる。しかしながら、多数の割り当て手法、たとえば多数のＣ／Ｃ＋＋のメモリ・モデルでは、「誰が」オブジェクトを破壊したか、およびプログラム・ソースにおいて「どこで」死亡したかの非常に明確な定義が存在する。ＩＢＭは、世界中の多くの管轄区で登録されたInternational Business Machines Corporationの商標である。Ｊａｖａ（Ｒ）および全てのＪａｖａ（Ｒ）関連の商標およびロゴは、Ｏｒａｃｌｅまたはその関連会社あるいはその両方の商標または登録商標である。
【００４９】
コンピュータ可読記憶媒体は、命令実行デバイスが使用するための命令を保持し記憶することが可能な有形デバイスとすることができる。コンピュータ可読記憶媒体は、たとえば、限定はされないが、電子記憶デバイス、磁気記憶デバイス、光学記憶デバイス、電磁記憶デバイス、半導体記憶デバイス、またはこれらの任意の適切な組合せとすることができる。コンピュータ可読記憶媒体のより具体的な例の非網羅的なリストは、ポータブル・コンピュータ・ディスケット、ハード・ディスク、ランダム・アクセス・メモリ（ＲＡＭ）、読み出し専用メモリ（ＲＯＭ）、消去可能プログラマブル読み出し専用メモリ（ＥＰＲＯＭまたはフラッシュ・メモリ）、スタティック・ランダム・アクセス・メモリ（ＳＲＡＭ）、ポータブル・コンパクト・ディスク読み出し専用メモリ（ＣＤ−ＲＯＭ）、デジタル多用途ディスク（ＤＶＤ）、メモリ・スティック、フロッピー（Ｒ）・ディスク、命令が記録されたパンチカードまたは溝内の隆起構造などの機械的に符号化されたデバイス、およびこれらの任意の適切な組合せを含む。本明細書で使用されるコンピュータ可読記憶媒体は、一時的な信号そのもの、たとえば電波または他の自由に伝播する電磁波、導波管または他の伝送媒体を通って伝播する電磁波（たとえば、光ファイバ・ケーブルを通過する光パルス）、またはワイヤを介して伝送される電気信号と解釈されるべきではない。
【００５０】
本明細書に記載のコンピュータ可読プログラム命令は、コンピュータ可読記憶媒体からそれぞれの計算／処理デバイスに、あるいはネットワーク、たとえばインターネット、ローカル・エリア・ネットワーク、ワイド・エリア・ネットワークもしくは無線ネットワークまたはこれらの組合せを介して外部コンピュータまたは外部記憶デバイスにダウンロードすることができる。ネットワークは、銅伝送ケーブル、光伝送ファイバ、無線伝送、ルータ、ファイアウォール、スイッチ、ゲートウェイ・コンピュータまたはエッジ・サーバあるいはこれらの組合せを含むことができる。各計算／処理デバイス内のネットワーク・アダプタ・カードまたはネットワーク・インタフェースは、ネットワークからコンピュータ可読プログラム命令を受信し、コンピュータ可読プログラム命令を転送して、それぞれの計算／処理デバイス内のコンピュータ可読記憶媒体に記憶できるようにする。
【００５１】
本発明の動作を実施するためのコンピュータ可読プログラム命令は、アセンブラ命令、命令セット・アーキテクチャ（ISA:instruction-set-architecture）命令、機械命令、機械依存命令、マイクロコード、ファームウェア命令、状態設定データ、あるいはSmalltalk（Ｒ）、Ｃ＋＋などのオブジェクト指向プログラミング言語、および「Ｃ」プログラミング言語または類似のプログラミング言語などの従来の手続き型プログラミング言語を含む１つまたは複数のプログラミング言語の任意の組合せで書かれたソース・コードまたはオブジェクト・コードでもよい。コンピュータ可読プログラム命令は、完全にユーザのコンピュータ上で、部分的にユーザのコンピュータ上で、スタンド・アローンのソフトウェア・パッケージとして、部分的にユーザのコンピュータ上であって部分的に遠隔コンピュータ上で、または完全に遠隔コンピュータまたはサーバ上で実行することができる。後者のシナリオでは、遠隔コンピュータは、ローカル・エリア・ネットワーク（ＬＡＮ）またはワイド・エリア・ネットワーク（ＷＡＮ）を含む任意のタイプのネットワークを介してユーザのコンピュータに接続することができ、または（たとえば、インターネット・サービス・プロバイダを使用してインターネットを介して）外部コンピュータに接続することができる。いくつかの実施形態では、たとえば、プログラマブル論理回路、列プログラマブル・ゲート・アレイ（ＦＰＧＡ）、またはプログラマブル論理アレイ（ＰＬＡ）を含む電子回路は、本発明の態様を実行するために、コンピュータ可読プログラム命令の状態情報を利用して電子回路をパーソナライズすることによってコンピュータ可読プログラム命令を実行することができる。
【００５２】
本発明の態様は、本明細書では、本発明の実施形態による方法、装置（システム）、およびコンピュータ・プログラム製品のフローチャート図またはブロック図あるいはその両方を参照して説明されている。フローチャート図またはブロック図あるいはその両方の各ブロック、ならびにフローチャート図またはブロック図あるいはその両方のブロックの組合せが、コンピュータ可読プログラム命令によって実装され得ることは理解されよう。
【００５３】
これらのコンピュータ可読プログラム命令は、コンピュータまたは他のプログラマブル・データ処理装置のプロセッサを介して実行される命令が、フローチャートまたはブロック図あるいはその両方の１つまたは複数のブロックで指定された機能／動作を実装するための手段を生成するように、汎用コンピュータ、専用コンピュータ、または他のプログラマブル・データ処理装置のプロセッサに提供されて、マシンを作り出すものであってよい。また、これらのコンピュータ可読プログラム命令は、命令が記憶されたコンピュータ可読記憶媒体が、フローチャートまたはブロック図あるいはその両方の１つまたは複数のブロックで指定された機能／動作の態様を実装する命令を含む製品を備えるように、コンピュータ可読記憶媒体に記憶され、コンピュータ、プログラマブル・データ処理装置または他のデバイスあるいはそれらの組合せに特定の方法で機能するように指示できるものであってもよい。
【００５４】
また、コンピュータ可読プログラム命令は、コンピュータ、他のプログラマブル装置、または他のデバイス上で実行される命令が、フローチャートまたはブロック図あるいはその両方の１つまたは複数のブロックで指定される機能／動作を実装するように、コンピュータ実装されるプロセスを生成すべく、コンピュータ、他のプログラマブル・データ処理装置、または他のデバイスにロードされ、コンピュータ、他のプログラマブル装置または他のデバイス上で一連の動作ステップを実行させるものであってもよい。
【００５５】
図面のフローチャートおよびブロック図は、本発明の様々な実施形態によるシステム、方法、およびコンピュータ・プログラム製品の可能な実装のアーキテクチャ、機能性、および動作を示す。これに関して、フローチャートまたはブロック図の各ブロックは、指定された論理機能を実装するための１つまたは複数の実行可能命令を含むモジュール、セグメント、または命令の一部を表すことができる。いくつかの代替的な実装では、ブロックに記されている機能は、図面に示された順序から外れて実施することができる。たとえば、連続して示された２つのブロックは、実際には実質的に同時に実行することができ、またはブロックは、関連する機能性に応じて逆の順序で実行されることがある。また、ブロック図またはフローチャート図あるいはその両方の各ブロック、およびブロック図またはフローチャート図あるいはその両方のブロックの組合せが、指定された機能または動作を実施するか、または専用ハードウェアおよびコンピュータ命令の組合せを実行する専用のハードウェア・ベースのシステムによって実装できることは気が付くであろう。
【図１】
0006674471.tif 000002
【図２】
0006674471.tif 000003
【図３】
0006674471.tif 000004
【図４】
0006674471.tif 000005
【図５】
0006674471.tif 000006
【図６】
0006674471.tif 000007
【図７】
0006674471.tif 000008
【図８】
0006674471.tif 000009
【図９】
0006674471.tif 000010