(57)【特許請求の範囲】
【請求項１】
コンピュータで実施されるメモリ管理方法であって、
メモリアロケーションテーブル内で第１の探索動作を実行して、クライアントに割り当てられたメモリブロックのメモリアドレスを表すハンドルに基づいて割り当てエントリを識別し、該割り当てエントリから追跡エントリポインタを取り出すステップと、
メモリ追跡テーブル内で第２の探索動作を実行して、前記追跡エントリポインタに基づいて追跡エントリを識別し、該追跡エントリのメモリ割り当て数を増分するステップと、
を含み、前記メモリの割り当て数を利用して、前記クライアントがメモリリークを引き起こす可能性を示す、
ことを特徴とする方法。
【請求項２】
前記クライアントが、プログラムの一連の実行可能コードのバックトレースを介して識別され、前記追跡エントリが、前記バックトレースのハッシュ値に基づいて前記メモリ追跡テーブル内でインデックスを付けられる、
ことを特徴とする請求項１に記載の方法。
【請求項３】
前記メモリアロケーションテーブルの前記割り当てエントリが、前記ハンドルのハッシュ値に基づいてインデックスを付けられる、
ことを特徴とする請求項１に記載の方法。
【請求項４】
前記割り当てエントリを調べて、該割り当てエントリが追跡エントリポインタを含むかどうかを判定することにより、前記割り当てエントリが使用のために空いているかどうかを判定するステップと、
前記割り当てエントリが空いている場合、前記メモリ追跡テーブルの前記追跡エントリのアドレスを使用して前記割り当てエントリを更新するステップと、
をさらに含むことを特徴とする請求項１に記載の方法。
【請求項５】
前記割り当てエントリが空いている場合、前記メモリ追跡テーブルの前記追跡エントリを調べて、前記メモリ割り当て数が所定値よりも大きいかどうかを判定するステップと、
前記メモリ割り当て数が所定値よりも大きい場合、前記クライアントが前記メモリ追跡テーブルの前記追跡エントリのオーナーと同じであるどうかを判定するステップと、
をさらに含み、前記クライアントが前記追跡エントリのオーナーと同じである場合、前記追跡エントリの前記メモリ割り当て数を増分する、
ことを特徴とする請求項４に記載の方法。
【請求項６】
前記割り当てエントリが空いておらず、既存の追跡エントリを参照する場合、前記クライアントが前記メモリ追跡テーブルの前記追跡エントリのオーナーと同じであるかどうかを判定するステップと、
前記クライアントが前記オーナーと同じでない場合、
前記既存の追跡エントリのメモリ割り当て数を減分するステップと、
前記追跡エントリのアドレスを使用して前記メモリアロケーションテーブルの前記割り当てエントリを更新するステップと、
を含むことを特徴とする請求項４に記載の方法。
【請求項７】
第２のハンドルによって識別される第２のメモリブロックの割り当て解除要求に応答して、前記第２のハンドルに基づいて、前記メモリアロケーションテーブルの第２の割り当てエントリから第２の追跡エントリポインタを取り出すステップと、
前記第２の追跡エントリポインタに基づいて前記メモリ追跡テーブルの第２の追跡エントリのメモリ割り当て数を減分するステップと、
をさらに含むことを特徴とする請求項１に記載の方法。
【請求項８】
前記第１及び第２の探索動作が、メモリ割り当て要求のサンプルに対してのみ実行される、
ことを特徴とする請求項１に記載の方法。
【請求項９】
機械による実行時に、前記機械にメモリの管理方法を実行させる命令を記憶した機械可読記憶媒体であって、前記方法が、
メモリアロケーションテーブル内で第１の探索動作を実行して、クライアントに割り当てられたメモリブロックのメモリアドレスを表すハンドルに基づいて割り当てエントリを識別し、該割り当てエントリから追跡エントリポインタを取り出すステップと、
メモリ追跡テーブル内で第２の探索動作を実行して、前記追跡エントリポインタに基づいて追跡エントリを識別し、該追跡エントリのメモリ割り当て数を増分するステップと、
を含み、前記メモリの割り当て数を利用して、前記クライアントがメモリリークを引き起こす可能性を示す、
ことを特徴とする機械可読記憶媒体。
【請求項１０】
前記クライアントが、プログラムの一連の実行可能コードのバックトレースを介して識別され、前記追跡エントリが、前記バックトレースのハッシュ値に基づいて前記メモリ追跡テーブル内でインデックスを付けられる、
ことを特徴とする請求項９に記載の機械可読記憶媒体。
【請求項１１】
前記メモリアロケーションテーブルの前記割り当てエントリが、前記ハンドルのハッシュ値に基づいてインデックスを付けられる、
ことを特徴とする請求項９に記載の機械可読記憶媒体。
【請求項１２】
前記方法が、
前記割り当てエントリを調べて、該割り当てエントリが追跡エントリポインタを含むかどうかを判定することにより、前記割り当てエントリが使用のために空いているかどうかを判定するステップと、
前記割り当てエントリが空いている場合、前記メモリ追跡テーブルの前記追跡エントリのアドレスを使用して前記割り当てエントリを更新するステップと、
をさらに含むことを特徴とする請求項９に記載の機械可読記憶媒体。
【請求項１３】
前記方法が、
前記割り当てエントリが空いている場合、前記メモリ追跡テーブルの前記追跡エントリを調べて、前記メモリ割り当て数が所定値よりも大きいかどうかを判定するステップと、
前記メモリ割り当て数が所定値よりも大きい場合、前記クライアントが前記メモリ追跡テーブルの前記追跡エントリのオーナーと同じであるどうかを判定するステップと、
をさらに含み、前記クライアントが前記追跡エントリのオーナーと同じである場合、前記追跡エントリの前記メモリ割り当て数を増分する、
ことを特徴とする請求項１２に記載の機械可読記憶媒体。
【請求項１４】
前記方法が、
前記割り当てエントリが空いておらず、既存の追跡エントリを参照する場合、前記クライアントが前記メモリ追跡テーブルの前記追跡エントリのオーナーと同じであるかどうかを判定するステップと、
前記クライアントが前記オーナーと同じでない場合、
前記既存の追跡エントリのメモリ割り当て数を減分するステップと、
前記追跡エントリのアドレスを使用して前記メモリアロケーションテーブルの前記割り当てエントリを更新するステップと、
を含むことを特徴とする請求項１２に記載の機械可読記憶媒体。
【請求項１５】
メモリアロケーションテーブル及びメモリ追跡テーブルを記憶するためのメモリと、
前記メモリアロケーションテーブル内で第１の探索動作を実行して、クライアントに割り当てられたメモリブロックのメモリアドレスを表すハンドルに基づいて割り当てエントリを識別し、該割り当てエントリから追跡エントリポインタを取り出すためのメモリ割り当てモジュールと、
を備え、前記メモリ割り当てモジュールが、前記メモリ追跡テーブル内で第２の探索動作を実行して、前記追跡エントリポインタに基づいて追跡エントリを識別し、該追跡エントリのメモリ割り当て数を増分するように構成され、前記メモリの割り当て数を利用して、前記クライアントがメモリリークを引き起こす可能性を示す、
ことを特徴とするデータ処理システム。
【請求項１６】
前記クライアントが、プログラムの一連の実行可能コードのバックトレースを介して識別され、前記追跡エントリが、前記バックトレースのハッシュ値に基づいて前記メモリ追跡テーブル内でインデックスを付けられる、
ことを特徴とする請求項１５に記載のシステム。
【請求項１７】
前記メモリアロケーションテーブルの前記割り当てエントリが、前記ハンドルのハッシュ値に基づいてインデックスを付けられる、
ことを特徴とする請求項１５に記載のシステム。
【請求項１８】
前記メモリ割り当てモジュールが、
前記割り当てエントリを調べて、前記割り当てエントリが追跡エントリポインタを含むかどうかを判定することにより、前記割り当てエントリが使用のために空いているかどうかを判定し、
前記割り当てエントリが空いている場合、前記メモリ追跡テーブルの前記追跡エントリのアドレスを使用して前記割り当てエントリを更新する、
ように構成されることを特徴とする請求項１５に記載のシステム。
【請求項１９】
前記メモリ割り当てモジュールが、
前記割り当てエントリが空いている場合、前記メモリ追跡テーブルの前記追跡エントリを調べて、前記メモリ割り当て数が所定値よりも大きいかどうかを判定し、
前記メモリ割り当て数が所定値よりも大きい場合、前記クライアントが前記メモリ追跡テーブルの前記追跡エントリのオーナーと同じであるどうかを判定し、前記クライアントが前記追跡エントリのオーナーと同じである場合、前記追跡エントリの前記メモリ割り当て数を増分する、
ように構成されることを特徴とする請求項１８に記載のシステム。
【請求項２０】
前記メモリ割り当てモジュールが、
前記割り当てエントリが空いておらず、既存の追跡エントリを参照する場合、前記クライアントが前記メモリ追跡テーブルの前記追跡エントリのオーナーと同じであるかどうかを判定し、
前記クライアントが前記オーナーと同じでない場合、
前記既存の追跡エントリのメモリ割り当て数を減分し、
前記追跡エントリのアドレスを使用して前記メモリアロケーションテーブルの前記割り当てエントリを更新する、
ように構成されることを特徴とする請求項１９に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、一般にデータ処理システムに関する。より詳細には、本発明の実施形態は、データ処理システムのメモリ使用状況を追跡するための機構に関する。
【背景技術】
【０００２】
データ処理システムは、オペレーティングシステム（ＯＳ）を使用してコンピュータのハードウェア及びソフトウェアリソースを管理する。ＯＳは、メモリの制御及び割り当て、命令処理の優先順位付け、入出力装置の制御、ネットワーク構築の支援、及びファイル管理などの基本タスクを行うソフトウェアプログラムである。ＯＳは、アプリケーションプログラムがハードウェア及びソフトウェアリソースと、及びその他のアプリケーションプログラムとやりとりできるようにするためのアプリケーションプログラムインターフェイス（ＡＰＩ）も提供する。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
ますます多くのサービスがデータ処理システムに利用できるようになるにつれ、システム内で実行されるプログラムの数も著しく増加した。通常、これらのプログラムの各々は、メモリなどの一定量のリソースを消費する。プログラムによっては、メモリリークを引き起こすものもある。例えば、あるプログラムにメモリブロックが割り当てられ、このプログラムが完了した時点でメモリブロックが正しく解放されないことがある。時間とともに、他のプログラムへの割り当てに利用できるメモリが次第に減少する。メモリ素子の密度は増え続けているにもかかわらず、メモリ容量は非常に限られてしまう。
【０００４】
通常、システムは、複数の実行中のアプリケーションによるメモリ使用状況をモニタして、必要な空きメモリ容量を利用できることを保証する。一部のシステムでは、メモリ使用量が臨界値に達すると、システムがガベージコレクション手順を始動させるなどの空きメモリのサイズを増やすためのメモリ管理対策を行って、もはや実行されていないアプリケーションから割り当てたメモリを獲得する。システムは、ある選択したアプリケーションを、このアプリケーションを終了させることなどによって標的にすることもできる。状況によっては、システム全体をさらに改善するために、誰がメモリリークを引き起こしたかを特定することが有用又は重要である。通常、オペレーティングシステムカーネルなどの単一の多目的プログラム内でメモリリークの原因を特定することは困難である。また一方、メモリリークの原因となる違反者を追跡又は特定する効率的な機構は存在していなかった。
【課題を解決するための手段】
【０００５】
同じ参照符号が同じ要素を示す添付図面の図に、本発明の実施形態を限定ではなく一例として示す。
【図面の簡単な説明】
【０００６】
【図１】本発明の実施形態による、メモリ使用状況を追跡するためのシステムを示すブロック図である。
【図２】本発明の実施形態による、アロケーションテーブル及び追跡テーブルの例を示すブロック図である。
【図３】本発明の実施形態による、メモリブロックの割り当て方法を示すフロー図である。
【図４】本発明の実施形態による、メモリブロックの割り当て解除方法を示すフロー図である。
【図５】本発明の実施形態による、メモリ割り当てプロセスを実施するプログラムを表す擬似コードである。
【図６】本発明の実施形態による、メモリ割り当て解除プロセスを実施するプログラムを表す擬似コードである。
【図７】本発明の実施形態による、メモリ割り当て方法を示すフロー図である。
【図８】本発明の実施形態とともに使用できるグラフィカルユーザインターフェイスを示すスクリーンショットである。
【図９】本発明の１つの実施形態とともに使用できるデータ処理システムのブロック図である。
【発明を実施するための形態】
【０００７】
以下で説明する詳細を参照しながら本発明の様々な実施形態及び態様について説明し、これらの様々な実施形態を添付図面に示す。以下の説明及び図面は本発明を例示するものであり、本発明を限定するものと解釈すべきではない。本発明の様々な実施形態を完全に理解できるようにするために、数多くの具体的な詳細について説明する。しかしながら、いくつかの例では、本発明の実施形態を簡潔に説明するために、周知の又は慣用な詳細については説明していない。
【０００８】
本明細書における「１つの実施形態」又は「ある実施形態」に対する言及は、その実施形態に関連して説明する特定の特徴、構造又は特性を本発明の少なくとも１つの実施形態に含めることができることを意味する。本明細書の様々な箇所で見られる「１つの実施形態では」という表現は、必ずしも全てが同じ実施形態について言及しているものではない。
【０００９】
いくつかの実施形態によれば、オペレーティングシステムのメモリマネージャが、メモリアロケーションテーブル（単純にアロケーションテーブルとも呼ぶ）及びメモリ追跡テーブル（単純に追跡テーブルとも呼ぶ）を保持して、メモリ割り当てを要求するクライアント又はオーナーのメモリの割り当て及び割り当て解除を追跡するように構成される。１つの実施形態では、アロケーションテーブルが複数のエントリを含み、これらのエントリの各々は、割り当てられたメモリブロックのメモリアドレスに基づいてインデックスを付けられる。各エントリは、追跡テーブルのエントリを参照するポインタを含む。追跡テーブルも複数のエントリを含み、これらのエントリの各々は、メモリ割り当てを要求したクライアント又はオーナーの識別子によってインデックスを付けられる。
【００１０】
メモリブロックがクライアントに割り当てられ、この割り当てられたメモリブロックのメモリアドレスを表すハンドルによって参照されると、メモリマネージャが、このハンドルに基づいてアロケーションテーブルの割り当てエントリを探索し、このエントリ内に追跡テーブルへのポインタが記憶されているかどうかを判定するように構成される。ポインタが存在する場合、このアロケーションテーブルから取り出したポインタに基づいて追跡テーブルの追跡エントリにアクセスし、この追跡エントリのメモリ割り当て情報を更新する。１つの実施形態では、メモリ割り当て要求に応答してメモリ割り当て数を増分（インクリメント）することができ、メモリ割り当て解除要求に応答してメモリ割り当て数を減分（ディクリメント）することができる 。このメモリ割り当て数を使用して、クライアントがメモリブロックの割り当てを要求し、このメモリブロックを正常に割り当て解除していない（例えばメモリリークの）可能性を示すことができる。
【００１１】
１つの実施形態では、メモリ割り当て及び／又は割り当て解除を要求したプログラムの一連の実行可能コード又はスタックフレームのバックトレースにより、割り当てたメモリブロックのクライアント又はオーナーを表すことができる。複雑な多目的プログラムでは、プログラムの動作の特定のサブセットをより正確に識別するためにバックトレースが有用である。アロケーションテーブル内のエントリの各々は、メモリ割り当てのハンドルのハッシュ値に基づいてインデックスを付けられる。追跡テーブル内のエントリの各々は、メモリ割り当て及び／又はメモリ割り当て解除を要求したプログラムのバックトレースのハッシュ値に基づいてインデックスを付けられる。この結果、メモリマネージャは、バックトレース及びこれらのメモリ割り当て数に基づいて、実行可能コードのいずれの（単複の）行がメモリリークを引き起こす可能性があるかをより効率的に特定することができる。
【００１２】
図１は、本発明の１つの実施形態による、メモリ使用状況を追跡するためのシステムを示すブロック図である。図１に示すシステム１００は、様々なデータ処理システム又は装置を表すことができる。例えば、システム１００は、デスクトップ、ラップトップ、タブレット、（スマートフォンなどの）携帯電話機、メディアプレーヤ、又はこれらの組み合わせなどのクライアントマシンを表すことができる。或いは、システム１００は、ウェブサーバ、アプリケーションサーバ、又はバックエンドサーバなどのサーバを表すことができる。図１を参照すると、システム１００は、ＡＰＩを介してメモリマネージャ１０３に通信可能に結合された１又はそれ以上のプログラム１０１〜１０２を含む。メモリマネージャ１０３は、カリフォルニア州クパチーノのＡｐｐｌｅ（登録商標）社から市販されているＭａｃＯＳ（商標）又はｉＯＳ（商標）、ワシントン州レッドモンドのＭｉｃｒｏｓｏｆｔ（登録商標）社から市販されているＷｉｎｄｏｗｓ（商標）オペレーティングシステム、及びＵｎｉｘ（登録商標）又はＬｉｎｕｘ（登録商標）オペレーティングシステムなどの様々なオペレーティングシステムとすることができるオペレーティングシステムの一部として実装することができる。プログラム１０１〜１０２及び／又はメモリマネージャ１０３は、オペレーティングシステムのユーザレベル又はカーネルレベルで実行することができる。例えば、プログラム１０１〜１０２のいずれかを、オペレーティングシステムの（アプリケーションなどの）ユーザレベル又は（デバイスドライバなどの）カーネルレベルで実行することができる。
【００１３】
１つの実施形態では、メモリ１０３が、メモリアロケーションテーブル１０５及びメモリ追跡テーブル１０６を有するメモリ使用状況マップ１０４を保持するように構成される。メモリ使用状況マップ１０４は、システム１００内で実行されているプログラム１０１〜１０２などのプログラムによるメモリ割り当て及び／又は割り当て解除などのメモリ使用状況を記録するように構成される。メモリ使用状況マップ１０４は、オペレーティングシステムにより、システム１００のランダムアクセスメモリ（ＲＡＭ）などのシステムメモリ内に保持することができる。
【００１４】
１つの実施形態によれば、メモリ使用状況マップ１０４のアロケーションテーブル１０５及び追跡テーブル１０６を利用して、クライアント又はオーナーによるメモリ割り当て及び割り当て解除を追跡する。例示を目的として、図２にアロケーションテーブル１０５及び追跡テーブル１０６の例を示している。図２を参照すると、１つの実施形態では、アロケーションテーブル１０５が複数のエントリを含み、これらの各々は、割り当てられたメモリブロックのメモリアドレス２０１に基づいてインデックスを付けられる。各エントリは、追跡テーブル１０６のエントリを参照するポインタ２０３を含む。アロケーションテーブル１０５の各エントリは、実際のメモリアドレス２０２などのその他の追加情報を含むこともできる。追跡テーブル１０６も複数のエントリを含み、これらの各々は、メモリ割り当てを要求したクライアント又はオーナーの識別子２０４によってインデックスを付けられる。追跡テーブル１０６の各追跡エントリは、メモリ割り当て数などのメモリ割り当て情報２０５、及び任意に実際のバックトレース２０６などのその他の情報をさらに含む。なお、図２に示すアロケーションテーブル１０５及び追跡テーブル１０６は例示目的で示すものに過ぎず、他のフォーマットを利用することも、これらのテーブルにより多くの又はより少ない情報を含めることもできる。
【００１５】
再び図１及び図２を参照すると、メモリブロックがクライアントに割り当てられ、この割り当てられたメモリブロックのメモリアドレスを表すハンドルによって参照されると、メモリアロケータ１０７が、（割り当てエントリ２０７のフィールド２０１などの）ハンドルに基づいてアロケーションテーブル１０５の（割り当てエントリ２０７などの）割り当てエントリを探索し、その（割り当てエントリ２０７のフィールド２０３などの）中に追跡テーブル１０６へのポインタ又はリンクが記憶されているかどうかを判定するように構成される。ポインタが存在する場合、アロケーションテーブル１０５から取り出したポインタに基づいて追跡テーブル１０６の（追跡エントリ２０９などの）追跡エントリにアクセスし（例えば、追跡エントリ２０９のフィールド２０４）、（追跡エントリ２０９のフィールド２０５などの）追跡エントリのメモリ割り当て情報を更新する。１つの実施形態では、メモリ割り当て情報が追跡エントリのメモリ割り当て数を含み、これをメモリ割り当て要求に応答して増分することができる。
【００１６】
１つの実施形態によれば、ハンドルにより参照されるメモリブロックの割り当て解除要求が受け取られると、メモリ割り当てデアロケータ１０８が、（割り当てエントリ２０８のフィールド２０１などの）ハンドルに基づいてアロケーションテーブル１０５の（割り当てエントリ２０８などの）割り当てエントリを探索し、追跡テーブル１０６の（追跡エントリ２０９などの）追跡エントリを参照する（割り当てエントリ２０８のフィールド２０３などの）ポインタを取り出すように構成される。次に、メモリデアロケータ１０８は、例えば追跡エントリのメモリ割り当て数を減分して（追跡エントリ２０９のフィールド２０５などの）メモリ解除情報を更新するように構成される。このメモリ割り当て数を使用して、クライアントがメモリブロックの割り当てを要求し、完了した時点でこのメモリブロックを正常に割り当て解除していない（例えばメモリリークの）可能性を示すことができる。この実施形態では、メモリ割り当て数が正の場合、プログラムが、ある期間にわたって、割り当て解除されたメモリブロックよりも多くのメモリブロックを割り当てられている可能性があることを示すことができる。メモリ割り当て数の多いプログラムは、メモリリークの疑いが高いと見なすことができる。１つの実施形態では、メモリマネージャ１０３が、分析及び／又はレポート目的で、例えばそれぞれのメモリ割り当て数に基づいて、１又はそれ以上のメモリリークの疑いが高いもののリストに関する情報を保持することができる。例えば、図８に示すように、ユーザは、アロケーションテーブル１０５及び追跡テーブル１０６からの情報に基づいて、１又はそれ以上のメモリリークの疑いが高いもののバックトレース情報を取得し、この情報を他の機構に送って分析することができる。
【００１７】
図３は、本発明の１つの実施形態による、メモリブロックの割り当て方法を示すフロー図である。例えば、方法３００は、図１のメモリマネージャ１０３によって実行することができる。図３を参照すると、ブロック３０１において、メモリマネージャが、クライアントからメモリブロック割り当て要求を受け取る。ブロック３０２において、この要求に応答して、メモリマネージャが、要求されたメモリブロックを割り当て、割り当てたメモリブロックの（開始メモリアドレスなどの）ハンドルを取得する。ブロック３０３において、メモリマネージャは、追跡テーブル内のクライアントに関連するエントリにメモリ割り当て情報を投入する。１つの実施形態では、追跡エントリのメモリ割り当て数を増分する。クライアントは、メモリ割り当てを要求した一連の実行可能コード又はスタックフレームのバックトレースによって表すことができる。ブロック３０４において、アロケーションテーブル内のメモリ割り当てのハンドルに対応する割り当てエントリ内に追跡エントリのアドレスを記憶する。その後、ブロック３０５において、メモリ割り当てのハンドルをクライアントに戻してメモリ要求プロセスを完了する。図５は、図３の方法３００を実施するプログラムを表す擬似コードである。
【００１８】
図４は、本発明の１つの実施形態による、メモリブロックの割り当て解除方法を示すフロー図である。例えば、方法４００は、図１のメモリマネージャ１０３によって実行することができる。図４を参照すると、ブロック４０１において、メモリマネージャが、ハンドルにより参照されるメモリブロックの解除要求をクライアントから受け取る。ブロック４０２において、この要求に応答して、メモリマネージャが、このメモリブロックをメモリプールに戻すように構成される。ブロック４０３において、メモリマネージャがメモリアロケーションテーブルを探索し、ハンドルに基づいて割り当てエントリを探し、このハンドルに対応する追跡テーブルの追跡エントリポインタを識別する。ブロック４０４において、この追跡エントリポインタに基づいて、メモリマネージャが、例えばメモリ割り当て数を減分することを含め、追跡エントリポインタによりリンクされる追跡エントリに記憶されたメモリ割り当て／割り当て解除情報を更新する。図６は、図４の方法４００を実施するプログラムを表す擬似コードである。
【００１９】
上述したようなメモリリーク検出機構は、オペレーティングシステムの一部として、或いはオペレーティングシステムのプラグイン又はカーネルの拡張機能として実装することができる。１つの実施形態によれば、誰かがメモリリークを引き起こしている可能性がある時にのみ、このメモリリーク検出機構を作動させることができる。まず１つの実施形態によれば、メモリリーク検出機構は、割り当てに利用できる残りのメモリが所定の閾値を下回るまで作動しない。通常、データ処理システムの起動時には、プログラムへの割り当てに利用できるリソース又はメモリが多く存在する。このような状況下では、メモリリークを追跡する必要はない。１つの実施形態によれば、割り当てに利用できる空きメモリが所定の閾値を下回ると、メモリ検出機構が作動する。多くの場合、データ処理システムではメモリリークが少なく、システムの性能に実質的に影響を及ぼさずにメモリリークを補償するのに十分なリソースが利用可能である。この結果、メモリリークを検出する必要がない場合もある。従って、メモリリーク検出機構は、関連するリソース消費を最小化する必要がある時にのみ作動する。
【００２０】
上述したように、メモリ割り当て要求が受け取られると、このようなメモリ割り当てが、上述したようなアロケーションテーブル及び追跡テーブルに記録される。１つの実施形態では、メモリ割り当て要求に応答して、割り当てられたメモリのハンドルに関連するエントリがアロケーションテーブル内で調べられ、この割り当てられたメモリのオーナーに関連するエントリが追跡テーブル内で調べられる。これに応じて、追跡エントリのメモリ割り当て数などのメモリ割り当て情報が更新される。割り当てられたメモリブロックの特定のハンドルに関し、アロケーションテーブル又は追跡テーブル内に対応するエントリが存在しない場合、例えばアロケーションテーブルのエントリに追跡エントリポインタを記憶して、追跡テーブル内の関連する追跡エントリのメモリ割り当て数を増分することにより、アロケーションテーブル又は追跡テーブル内に新たなエントリが割り当てられ又は作成される。
【００２１】
同様に、メモリブロックの割り当て解除要求を受け取った場合、関連するメモリ割り当て数を減分して、アロケーションテーブルの関連する割り当てエントリ内の対応する追跡エントリポインタをヌル又はゼロなどの所定の値にリセットすることができる。特定の追跡エントリのメモリ割り当て数がゼロに達した場合、この特定の追跡エントリを他の誰かに自由に割り当てできるということになる。同様に、アロケーションテーブルの特定の割り当てエントリの追跡エントリポインタが有効なエントリポインタを含まない（例えばヌル又はゼロの）場合、この特定の割り当てエントリは自由に割り当てることができる。１つの実施形態によれば、比較的小型のアロケーションテーブル及び／又は追跡テーブルを維持するとともに、簿記に関連するＣＰＵオーバーヘッドを再現するために、メモリ割り当て要求のサンプルのみを記録する。例えば、ポリシーに基づいて構成できるＮ個のメモリ割り当てのうちの１つを記録することができる。このようにすると、一部のメモリリーク違反者は見つけることができないが、最終的に常習的なメモリリーク違反者が見つかるようになる。この構成では、主なメモリリーク違反者を捕らえることができる一方で、メモリリークの検出に消費されるシステムリソース又は処理電力が少なくて済む。
【００２２】
１つの実施形態では、メモリ割り当て及び／又は割り当て解除を要求した一連の実行可能コードのバックトレース（例えば、スタックフレームのバックトレース）により、割り当てたメモリブロックのクライアント又はオーナーを表すことができる。アロケーションテーブル内のエントリの各々は、メモリ割り当てのハンドルのハッシュ値に基づいてインデックスを付けられる。追跡テーブル内のエントリの各々は、メモリ割り当て及び／又は割り当て解除を要求したプログラムのバックトレースのハッシュ値に基づいてインデックスを付けられる。この結果、メモリマネージャは、バックトレース及びこれらのメモリ割り当て数に基づいて、実行可能コードのいずれの行がメモリリークを引き起こす可能性があるかを特定することができる。
【００２３】
再び図１及び図２を参照すると、バックトレースモジュール１０９によってプログラム１０１〜１０２のいずれかのバックトレースを取得し、これをメモリマネージャ１０３に提供することができる。バックトレースモジュール１０９は、ＡＰＩを介して、メモリの割り当て又は割り当て解除を要求した最新のスレッドのスタックフレームのバックトレースをメモリマネージャが取得できるようにする、オペレーティングシステムのカーネルの拡張機能として実装することができる。図８に、分析モジュール１１０がメモリ使用状況レポート１１１（例えば、メモリリークレポート）の一部としてレポートできるバックトレースの例を示している。このメモリ使用状況レポート１１１を動的に又はオフラインでさらに分析して、システム１００に現在インストールされているどのプログラムが大部分のメモリリークを引き起こしているかを特定することができる。
【００２４】
図２を参照して分かるように、アロケーションテーブル１０５及び追跡テーブル１０６は、アレイ、データ構造、データオブジェクト、又はこれらの組み合わせ（例えば、データ構造のリンクリスト）などの様々な形で実装することができる。１つの実施形態では、アロケーションテーブル１０５が、割り当てたメモリブロックに関連するメモリアドレスのハッシュ値に基づいてインデックスを付けられた複数のエントリを含む。例えば、メモリブロックを割り当てる際に、メモリブロックのハンドルを取得する。このハンドルのハッシュに基づいてアロケーションテーブル１０５のエントリが識別され、このハッシュは、様々なハッシュ関数、又はＪｅｎｋｉｎｓ、ＦＮＶ、ＳＨＡ−１又はＭＤ５ハッシュアルゴリズムなどのアルゴリズムを使用して生成することができる。すなわち、ハンドルのハッシュ値を取得すると、このハッシュ値をフィールド２０１のインデックスとして利用して、アロケーションテーブル１０５内のエントリを探すことができる。１つの実施形態では、アロケーションテーブル１０５の各エントリが、メモリ割り当ての実際のハンドル又はメモリアドレスを記憶するためのフィールド２０２、及び追跡テーブル１０６の追跡エントリを参照するポインタを記憶するためのフィールド２０３をさらに含む。アロケーションテーブル１０５には、その他の情報を記憶することもできる。
【００２５】
同様に、１つの実施形態によれば、追跡テーブル１０６は、メモリ割り当て又は割り当て解除を要求するクライアント又はオーナーを表すバックトレースのハッシュ値に基づいてインデックスを付けられた複数のエントリを含む。例えば、あるクライアントにメモリブロックが割り当てられると、このクライアントのバックトレースがオペレーティングシステムから（バックトレースモジュール１０９などを介して）取得される。このバックトレースのハッシュに基づいて追跡テーブル１０６のエントリが識別され、このハッシュは、様々なハッシュ関数、又はＪｅｎｋｉｎｓ、ＦＮＶ、ＳＨＡ−１、又はＭＤ５ハッシュアルゴリズムなどのアルゴリズムを使用して生成することができる。すなわち、バックトレースのハッシュ値を取得すると、このハッシュ値をフィールド２０４のインデックスとして利用して、追跡テーブル１０６内のエントリを探すことができる。１つの実施形態では、追跡テーブル１０６の各エントリが、例えばメモリ割り当て数などの、エントリに関連するメモリ割り当て情報を記憶するためのフィールド２０５をさらに含む。追跡テーブル１０６の各エントリは、そのエントリに関連する実際のバックトレースなどのその他の情報を記憶するためのフィールド２０６をさらに含む。追跡テーブル１０６には、その他の情報を記憶することもできる。
【００２６】
図２に示すように、１つの実施形態によれば、アロケーションテーブル１０５のインデックスとしてハンドルのハッシュ、及び追跡テーブル１０６のインデックスとしてバックトレースのハッシュを使用することにより、アロケーションテーブル１０５及び追跡テーブル１０６のサイズを適当なサイズに維持することができる。すなわち、アロケーションテーブル１０５及び追跡テーブル１０６の各々は、ハンドルのハッシュ及びバックトレースのハッシュにそれぞれ基づいて識別され又は見つけ出された一定数のエントリ又はスロットを含む。しかしながら、（ハンドル又はバックトレースなどの）異なる値のハッシュから同じハッシュ値が生じることもある（例えば、ハッシュの衝突）。この結果、アロケーションテーブル１０５のエントリ２０７〜２０８などの複数のエントリが、追跡テーブル１０６の同じ追跡エントリ２０９を参照できることもある。いくつかの実施形態によれば、ある状況下では、アロケーションテーブル１０５及び追跡テーブル１０６によって消費されるリソースを制限するために、アロケーションテーブル１０５及び追跡テーブル１０６に一部のメモリ割り当てを記録しなくてもよい。システムは、総エントリ数までのメモリ割り当てのみをアロケーションテーブル１０５及び追跡テーブル１０６に記録することができる。状況によっては、新たなメモリ割り当てが記録されると、同じスロットを占めている先に記録されていたメモリ割り当てが、状況に応じてテーブルから排除され又はテーブル内で無効になる。上述したように、特定の時点に一部のメモリリーク違反者を捕らえることはできないが、最終的に常習的なメモリリーク違反者が捕らえられるようになる。
【００２７】
図７は、本発明の別の実施形態によるメモリ割り当て方法を示すフロー図である。方法７００は、ソフトウェア、ハードウェア、又はこれらの組み合わせに処理ロジックとして実装できる図１のメモリマネージャ１０３によって実行することができる。図２及び図７を参照すると、ブロック７０１において、ハンドルにより参照されるメモリ割り当てに応答して、処理ロジックが、メモリ割り当てを要求したプログラムのハンドルのハッシュ及びバックトレースのハッシュを取得し、アロケーションテーブル１０５及び追跡テーブル１０６を探索する。ブロック７０２において、処理ロジックは、アロケーションテーブル１０５の割り当てエントリを、バックトレースによって表されるクライアントに自由に割り当てできるどうかを判定する。１つの実施形態では、処理ロジックが、ハンドルのハッシュをインデックスとして使用して、アロケーションテーブル１０５のフィールド２０１内を探索し、割り当てエントリを見つけ出す。次に、処理ロジックは、この割り当てエントリのフィールド２０３を調べて、このフィールド内に記憶された追跡エントリポインタが存在するかどうかを判定する。フィールド内に記憶された追跡エントリポインタが存在しない場合、この割り当てエントリは自由に使用できると見なされる。
【００２８】
割り当てエントリが空いていると判定された場合、ブロック７０３において、処理ロジックは、バックトレースのハッシュをフィールド２０４内でインデックスとして使用して追跡テーブル１０６を探索し、追跡エントリを見つけ出す。次に、処理ロジックは、この追跡エントリのフィールド２０５を調べて、追跡エントリが空いているかどうかを判定する。１つの実施形態では、フィールド２０５がいくつかのメモリ割り当て情報を含む場合、この例ではメモリ割り当て数が非ゼロである場合、追跡エントリは塞がっており、非ゼロでなければ追跡エントリは空いている。追跡エントリが空いている（例えば、現在のメモリ割り当てが新たなメモリ割り当てであって初めて記録される）と判定された場合、ブロック７０４において、処理ロジックは、アロケーションテーブル１０５及び追跡テーブル１０６の両方に必要な情報を投入する。１つの実施形態では、処理ロジックが、実際のメモリハンドルをアロケーションテーブル１０５内の割り当てエントリのフィールド２０２に記憶し、関連する追跡エントリのメモリアドレスを割り当てエントリのフィールド２０３に記憶する。また、処理ロジックは、実際のバックトレースの少なくとも一部を追跡エントリのフィールド２０６にさらに記憶して、追跡テーブル１０６内の追跡エントリのフィールド２０５のメモリ割り当て数を増分する。１つの実施形態では、追跡テーブル１０６のサイズを制限するために、（１５行などの所定数のコード又はスタックフレームなどの）バックトレースの限られた量の情報のみを追跡エントリのフィールド２０６に記憶する。追跡エントリのメモリアドレスを割り当てエントリのフィールド２０３に記憶することにより、この割り当てエントリは塞がっていると見なされる。同様に、非ゼロのメモリ割り当て数を追跡エントリのフィールド２０５に記憶することにより、この追跡エントリが塞がるようになる。
【００２９】
１つの実施形態によれば、ブロック７０３において追跡エントリが塞がっている（例えば、メモリ割り当て数が非ゼロである）と判定された場合、ブロック７０５において、処理ロジックは、この追跡エントリが同じオーナー又はクライアントに関連するものであるかどうかを判定する。１つの実施形態では、処理ロジックが、メモリ割り当てを要求している現在のスレッドの実際のバックトレースを、現在追跡エントリのフィールド２０６に記憶されているバックトレースと比較する。これらの両バックトレースが一致する場合、この追跡エントリは同じオーナーにより所有されている。追跡エントリが同じオーナーにより所有されている場合、ブロック７０６において、追跡エントリのフィールド２０５に記憶されたメモリ割り当て数を増分する。ブロック７０７において、追跡エントリのメモリアドレスを割り当てエントリのフィールド２０３に記憶し、これにより、この割り当てエントリが現在塞がっていることを示す。
【００３０】
なお、この時点で、同じ追跡エントリを参照する割り当てエントリが複数存在することもある。例えば、追跡エントリのメモリ割り当て数が２の場合、追跡テーブル１０６の対応する追跡エントリに関連するアロケーションテーブル１０５内に少なくとも２つの割り当てエントリが存在する可能性がある。すなわち、あるオーナーに複数のメモリブロックが割り当てられ、これらの一部が解放されていない可能性がある。例えば、図２を参照すると、バックトレースによって表されるオーナーに第１のメモリブロックが割り当てられ、この結果、（第１のハンドルに基づく）割り当てエントリ２０７が追跡エントリ２０９を参照していると想定される。その後、同じオーナー（例えば同じバックトレース）に第２のメモリブロックが割り当てられ、この結果、（第２のハンドルに基づく）割り当てエントリ２０８が（バックトレースが同じであるため）同じ追跡エントリ２０９を参照するようになる。この結果、両割り当てエントリ２０７〜２０８が、メモリ割り当て数が２である同じ追跡エントリを参照するようになる。
【００３１】
１つの実施形態によれば、ブロック７０２において、割り当てエントリが塞がっていると判定された場合、ブロック７０８において、処理ロジックは、この割り当てエントリにより参照される追跡エントリを調べて、（上述したようにバックトレースを比較することにより）この追跡エントリが同じオーナーによって所有されているかどうかを判定する。また、処理ロジックは、実際のハンドルを割り当てエントリのフィールド２０２に記憶されているハンドルとさらに比較して、このメモリ割り当てが既に記録されているメモリ割り当てと同じものであるかどうかを判定することができる。このメモリ割り当てが同じオーナー又は同じハンドルのものである場合、このメモリ割り当ては既に処理されているので、処理ロジックは、現在のメモリ割り当て処理をスキップすることができる。このメモリ割り当てが同じオーナーのものでない場合、ブロック７０９において、この新たなオーナーに追跡テーブル１０６から新たな追跡エントリが割り当てられる。また、フィールド２０３内の追跡エントリポインタを新たな追跡エントリのアドレスに置き替え、この新たな追跡エントリのメモリ割り当て数を増分する。なお、この時点で、割り当てエントリは、古い追跡エントリの代わりに新たな追跡エントリにリンクされる。ブロック７１０において、追跡テーブル１０６内の古い追跡エントリのメモリ割り当て数を減分する。
【００３２】
図９は、本発明の１つの実施形態とともに使用できるデータ処理システムのブロック図である。例えば、システム９００は、図１に示すシステム１００の一部として使用することができる。なお、図９には、コンピュータシステムの様々な構成要素を示しているが、これらの構成要素を相互接続する特定のアーキテクチャ又は態様は本発明に密接に関係しないので、このような詳細を示すことは意図していない。より少ない又はより多くの構成要素を有するネットワークコンピュータ、ハンドヘルドコンピュータ、携帯電話機、及びその他のデータ処理システムを本発明とともに使用できることも理解されるであろう。図９のコンピュータシステムは、例えば、Ａｐｐｌｅ社のＭａｃｉｎｔｏｓｈコンピュータ又はＭａｃＢｏｏｋ、ＩＢＭ互換ＰＣ、又はコンピュータサーバとすることができる。
【００３３】
図９に示すように、データ処理システムの１つの形態であるコンピュータシステム９００は、１又はそれ以上のマイクロプロセッサ９０３及びＲＯＭ９０７、揮発性ＲＡＭ９０５及び不揮発性メモリ９０６に結合されたバス又は相互接続部９０２を含む。マイクロプロセッサ９０３は、キャッシュメモリ９０４に結合される。バス９０２は、これらの様々な構成要素を互いに相互接続するとともに、これらの構成要素９０３、９０７、９０５及び９０６をディスプレイコントローラ及びディスプレイ装置９０８に、並びにマウス、キーボード、モデム、ネットワークインターフェイス、プリンタ及び当業で周知のその他の装置とすることができる入力／出力（Ｉ／Ｏ）装置９１０にも相互接続する。
【００３４】
通常、入力／出力装置９１０は、入力／出力コントローラ９０９を介してシステムに結合される。通常、揮発性ＲＡＭ９０５は、メモリ内のデータを更新又は維持するために継続的に電力を必要とするダイナミックＲＡＭ（ＤＲＡＭ）として実装される。通常、不揮発性メモリ９０６は、磁気ハードドライブ、光磁気ドライブ、光ドライブ、又はＤＶＤ  ＲＡＭ、又はシステムから電力が除去された後でもデータを維持するその他の種類のメモリシステムである。通常、不揮発性メモリはランダムアクセスメモリであるが、これは必須ではない。
【００３５】
図９には、不揮発性メモリがデータ処理システム内のその他の構成要素に直接結合されたローカルデバイスであることを示しているが、本発明は、モデム又はイーサネット（登録商標）インターフェイスなどのネットワークインターフェイスを介してデータ処理システムに結合されたネットワーク記憶装置などの、システムから遠隔にある不揮発性メモリを利用することもできる。バス９０２は、当業で周知の様々なブリッジ、コントローラ及び／又はアダプタを介して互いに接続された１又はそれ以上のバスを含むことができる。１つの実施形態では、Ｉ／Ｏコントローラ９０９が、ＵＳＢ周辺機器を制御するためのＵＳＢ（ユニバーサルシリアルバス）アダプタを含む。或いは、Ｉ／Ｏコントローラ９０９は、ＦｉｒｅＷｉｒｅ装置を制御するための、ＦｉｒｅＷｉｒｅアダプタとしても知られているＩＥＥＥ１３９４アダプタを含むことができる。
【００３６】
上述した詳細な説明の一部は、コンピュータメモリ内のデータビットにおける演算のアルゴリズム及び記号表現の観点から示したものである。これらアルゴリズムによる記述及び表現は、データ処理における当業者が自らの研究内容を他の当業者に最も効果的に伝えるために使用する方法である。本明細書では、及び一般的に、アルゴリズムとは、望ましい結果をもたらす首尾一貫した一連の演算であると考えられる。これらの演算は、物理量の物理的操作を必要とするものである。
【００３７】
しかしながら、これらの及び同様の用語は、全て適当な物理量に関連付けられるべきものであり、またこれらの量に与えられた便利な表記に過ぎないことに留意されたい。上述の説明から明らかなように、特に別途述べていない限り、本発明全体を通じ、以下の特許請求の範囲に記載するような用語を利用した説明は、コンピュータシステムのレジスタ及びメモリ内の物理（電子）量として表されるデータを操作し、コンピュータシステムのメモリ、レジスタ、又はその他のこのような情報記憶装置、送信又は表示装置内の物理量として同様に表される他のデータに変換するコンピュータシステム又は同様の電子コンピュータ装置の動作及び処理を意味するものである。
【００３８】
図示の技術は、１又はそれ以上の電子装置上に記憶され実行されるコード及びデータを使用して実現することができる。このような電子装置は、（磁気ディスク、光ディスク、ランダムアクセスメモリ、読み取り専用メモリ、フラッシュメモリデバイス、相変化メモリなどの）非一時的コンピュータ可読記憶媒体及び（電気信号、光信号、音響信号、又は搬送波、赤外線信号、デジタル信号などのその他の形の伝搬信号などの）一時的コンピュータ可読伝送媒体などのコンピュータ可読媒体を使用してコード及びデータを記憶し（内部的に及び／又はネットワークを介して他の電子装置と）通信する。
【００３９】
上述した図に示すプロセス又は方法は、（回路、専用ロジックなどの）ハードウェア、ファームウェア、（非一時的コンピュータ可読媒体上で具体化されるような）ソフトウェア、又はこれらの組み合わせを含むロジックを処理することにより実施することができる。上記では、これらのプロセス又は方法をいくつかの順次処理の観点から説明したが、説明した動作の一部を異なる順序で実行することもできると理解されたい。さらに、動作によっては、順次的にではなく同時に実行できるものもある。
【００４０】
上述の明細書では、本発明の実施形態をその特定の例示的な実施形態を参照しながら説明した。特許請求の範囲に示す本発明の幅広い思想及び範囲から逸脱することなく本発明に様々な修正を行えることが明白であろう。従って、明細書及び図面は、限定的な意味ではなく例示的な意味で捉えるべきである。
【図１】
0005425286.tif 000002
【図２】
0005425286.tif 000003
【図３】
0005425286.tif 000004
【図４】
0005425286.tif 000005
【図５】
0005425286.tif 000006
【図６】
0005425286.tif 000007
【図７】
0005425286.tif 000008
【図８】
0005425286.tif 000009
【図９】
0005425286.tif 000010