説明

データ処理システムのメモリ使用状況を追跡する方法

【課題】データ処理システムのメモリ使用状況を追跡する技術を提供する。
【解決手段】1つの実施形態によれば、メモリマネージャが、メモリアロケーションテーブル内で第1の探索動作を実行して、クライアントに割り当てられたメモリブロックのメモリアドレスを表すハンドルに基づいて割り当てエントリを識別し、この割り当てエントリから追跡エントリポインタを取り出す。次に、メモリマネージャは、メモリ追跡テーブル内で第2の探索動作を実行して、追跡エントリポインタに基づいて追跡エントリを識別し、この追跡エントリのメモリ割り当て数を増分する。このメモリ割り当て数を利用して、クライアントがメモリリークを引き起こす可能性を示す。

【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、一般にデータ処理システムに関する。より詳細には、本発明の実施形態は、データ処理システムのメモリ使用状況を追跡するための機構に関する。
【背景技術】
【0002】
データ処理システムは、オペレーティングシステム(OS)を使用してコンピュータのハードウェア及びソフトウェアリソースを管理する。OSは、メモリの制御及び割り当て、命令処理の優先順位付け、入出力装置の制御、ネットワーク構築の支援、及びファイル管理などの基本タスクを行うソフトウェアプログラムである。OSは、アプリケーションプログラムがハードウェア及びソフトウェアリソースと、及びその他のアプリケーションプログラムとやりとりできるようにするためのアプリケーションプログラムインターフェイス(API)も提供する。
【発明の概要】
【発明が解決しようとする課題】
【0003】
ますます多くのサービスがデータ処理システムに利用できるようになるにつれ、システム内で実行されるプログラムの数も著しく増加した。通常、これらのプログラムの各々は、メモリなどの一定量のリソースを消費する。プログラムによっては、メモリリークを引き起こすものもある。例えば、あるプログラムにメモリブロックが割り当てられ、このプログラムが完了した時点でメモリブロックが正しく解放されないことがある。時間とともに、他のプログラムへの割り当てに利用できるメモリが次第に減少する。メモリ素子の密度は増え続けているにもかかわらず、メモリ容量は非常に限られてしまう。
【0004】
通常、システムは、複数の実行中のアプリケーションによるメモリ使用状況をモニタして、必要な空きメモリ容量を利用できることを保証する。一部のシステムでは、メモリ使用量が臨界値に達すると、システムがガベージコレクション手順を始動させるなどの空きメモリのサイズを増やすためのメモリ管理対策を行って、もはや実行されていないアプリケーションから割り当てたメモリを獲得する。システムは、ある選択したアプリケーションを、このアプリケーションを終了させることなどによって標的にすることもできる。状況によっては、システム全体をさらに改善するために、誰がメモリリークを引き起こしたかを特定することが有用又は重要である。通常、オペレーティングシステムカーネルなどの単一の多目的プログラム内でメモリリークの原因を特定することは困難である。また一方、メモリリークの原因となる違反者を追跡又は特定する効率的な機構は存在していなかった。
【課題を解決するための手段】
【0005】
同じ参照符号が同じ要素を示す添付図面の図に、本発明の実施形態を限定ではなく一例として示す。
【図面の簡単な説明】
【0006】
【図1】本発明の実施形態による、メモリ使用状況を追跡するためのシステムを示すブロック図である。
【図2】本発明の実施形態による、アロケーションテーブル及び追跡テーブルの例を示すブロック図である。
【図3】本発明の実施形態による、メモリブロックの割り当て方法を示すフロー図である。
【図4】本発明の実施形態による、メモリブロックの割り当て解除方法を示すフロー図である。
【図5】本発明の実施形態による、メモリ割り当てプロセスを実施するプログラムを表す擬似コードである。
【図6】本発明の実施形態による、メモリ割り当て解除プロセスを実施するプログラムを表す擬似コードである。
【図7】本発明の実施形態による、メモリ割り当て方法を示すフロー図である。
【図8】本発明の実施形態とともに使用できるグラフィカルユーザインターフェイスを示すスクリーンショットである。
【図9】本発明の1つの実施形態とともに使用できるデータ処理システムのブロック図である。
【発明を実施するための形態】
【0007】
以下で説明する詳細を参照しながら本発明の様々な実施形態及び態様について説明し、これらの様々な実施形態を添付図面に示す。以下の説明及び図面は本発明を例示するものであり、本発明を限定するものと解釈すべきではない。本発明の様々な実施形態を完全に理解できるようにするために、数多くの具体的な詳細について説明する。しかしながら、いくつかの例では、本発明の実施形態を簡潔に説明するために、周知の又は慣用な詳細については説明していない。
【0008】
本明細書における「1つの実施形態」又は「ある実施形態」に対する言及は、その実施形態に関連して説明する特定の特徴、構造又は特性を本発明の少なくとも1つの実施形態に含めることができることを意味する。本明細書の様々な箇所で見られる「1つの実施形態では」という表現は、必ずしも全てが同じ実施形態について言及しているものではない。
【0009】
いくつかの実施形態によれば、オペレーティングシステムのメモリマネージャが、メモリアロケーションテーブル(単純にアロケーションテーブルとも呼ぶ)及びメモリ追跡テーブル(単純に追跡テーブルとも呼ぶ)を保持して、メモリ割り当てを要求するクライアント又はオーナーのメモリの割り当て及び割り当て解除を追跡するように構成される。1つの実施形態では、アロケーションテーブルが複数のエントリを含み、これらのエントリの各々は、割り当てられたメモリブロックのメモリアドレスに基づいてインデックスを付けられる。各エントリは、追跡テーブルのエントリを参照するポインタを含む。追跡テーブルも複数のエントリを含み、これらのエントリの各々は、メモリ割り当てを要求したクライアント又はオーナーの識別子によってインデックスを付けられる。
【0010】
メモリブロックがクライアントに割り当てられ、この割り当てられたメモリブロックのメモリアドレスを表すハンドルによって参照されると、メモリマネージャが、このハンドルに基づいてアロケーションテーブルの割り当てエントリを探索し、このエントリ内に追跡テーブルへのポインタが記憶されているかどうかを判定するように構成される。ポインタが存在する場合、このアロケーションテーブルから取り出したポインタに基づいて追跡テーブルの追跡エントリにアクセスし、この追跡エントリのメモリ割り当て情報を更新する。1つの実施形態では、メモリ割り当て要求に応答してメモリ割り当て数を増分(インクリメント)することができ、メモリ割り当て解除要求に応答してメモリ割り当て数を減分(ディクリメント)することができる 。このメモリ割り当て数を使用して、クライアントがメモリブロックの割り当てを要求し、このメモリブロックを正常に割り当て解除していない(例えばメモリリークの)可能性を示すことができる。
【0011】
1つの実施形態では、メモリ割り当て及び/又は割り当て解除を要求したプログラムの一連の実行可能コード又はスタックフレームのバックトレースにより、割り当てたメモリブロックのクライアント又はオーナーを表すことができる。複雑な多目的プログラムでは、プログラムの動作の特定のサブセットをより正確に識別するためにバックトレースが有用である。アロケーションテーブル内のエントリの各々は、メモリ割り当てのハンドルのハッシュ値に基づいてインデックスを付けられる。追跡テーブル内のエントリの各々は、メモリ割り当て及び/又はメモリ割り当て解除を要求したプログラムのバックトレースのハッシュ値に基づいてインデックスを付けられる。この結果、メモリマネージャは、バックトレース及びこれらのメモリ割り当て数に基づいて、実行可能コードのいずれの(単複の)行がメモリリークを引き起こす可能性があるかをより効率的に特定することができる。
【0012】
図1は、本発明の1つの実施形態による、メモリ使用状況を追跡するためのシステムを示すブロック図である。図1に示すシステム100は、様々なデータ処理システム又は装置を表すことができる。例えば、システム100は、デスクトップ、ラップトップ、タブレット、(スマートフォンなどの)携帯電話機、メディアプレーヤ、又はこれらの組み合わせなどのクライアントマシンを表すことができる。或いは、システム100は、ウェブサーバ、アプリケーションサーバ、又はバックエンドサーバなどのサーバを表すことができる。図1を参照すると、システム100は、APIを介してメモリマネージャ103に通信可能に結合された1又はそれ以上のプログラム101〜102を含む。メモリマネージャ103は、カリフォルニア州クパチーノのApple(登録商標)社から市販されているMacOS(商標)又はiOS(商標)、ワシントン州レッドモンドのMicrosoft(登録商標)社から市販されているWindows(商標)オペレーティングシステム、及びUnix(登録商標)又はLinux(登録商標)オペレーティングシステムなどの様々なオペレーティングシステムとすることができるオペレーティングシステムの一部として実装することができる。プログラム101〜102及び/又はメモリマネージャ103は、オペレーティングシステムのユーザレベル又はカーネルレベルで実行することができる。例えば、プログラム101〜102のいずれかを、オペレーティングシステムの(アプリケーションなどの)ユーザレベル又は(デバイスドライバなどの)カーネルレベルで実行することができる。
【0013】
1つの実施形態では、メモリ103が、メモリアロケーションテーブル105及びメモリ追跡テーブル106を有するメモリ使用状況マップ104を保持するように構成される。メモリ使用状況マップ104は、システム100内で実行されているプログラム101〜102などのプログラムによるメモリ割り当て及び/又は割り当て解除などのメモリ使用状況を記録するように構成される。メモリ使用状況マップ104は、オペレーティングシステムにより、システム100のランダムアクセスメモリ(RAM)などのシステムメモリ内に保持することができる。
【0014】
1つの実施形態によれば、メモリ使用状況マップ104のアロケーションテーブル105及び追跡テーブル106を利用して、クライアント又はオーナーによるメモリ割り当て及び割り当て解除を追跡する。例示を目的として、図2にアロケーションテーブル105及び追跡テーブル106の例を示している。図2を参照すると、1つの実施形態では、アロケーションテーブル105が複数のエントリを含み、これらの各々は、割り当てられたメモリブロックのメモリアドレス201に基づいてインデックスを付けられる。各エントリは、追跡テーブル106のエントリを参照するポインタ203を含む。アロケーションテーブル105の各エントリは、実際のメモリアドレス202などのその他の追加情報を含むこともできる。追跡テーブル106も複数のエントリを含み、これらの各々は、メモリ割り当てを要求したクライアント又はオーナーの識別子204によってインデックスを付けられる。追跡テーブル106の各追跡エントリは、メモリ割り当て数などのメモリ割り当て情報205、及び任意に実際のバックトレース206などのその他の情報をさらに含む。なお、図2に示すアロケーションテーブル105及び追跡テーブル106は例示目的で示すものに過ぎず、他のフォーマットを利用することも、これらのテーブルにより多くの又はより少ない情報を含めることもできる。
【0015】
再び図1及び図2を参照すると、メモリブロックがクライアントに割り当てられ、この割り当てられたメモリブロックのメモリアドレスを表すハンドルによって参照されると、メモリアロケータ107が、(割り当てエントリ207のフィールド201などの)ハンドルに基づいてアロケーションテーブル105の(割り当てエントリ207などの)割り当てエントリを探索し、その(割り当てエントリ207のフィールド203などの)中に追跡テーブル106へのポインタ又はリンクが記憶されているかどうかを判定するように構成される。ポインタが存在する場合、アロケーションテーブル105から取り出したポインタに基づいて追跡テーブル106の(追跡エントリ209などの)追跡エントリにアクセスし(例えば、追跡エントリ209のフィールド204)、(追跡エントリ209のフィールド205などの)追跡エントリのメモリ割り当て情報を更新する。1つの実施形態では、メモリ割り当て情報が追跡エントリのメモリ割り当て数を含み、これをメモリ割り当て要求に応答して増分することができる。
【0016】
1つの実施形態によれば、ハンドルにより参照されるメモリブロックの割り当て解除要求が受け取られると、メモリ割り当てデアロケータ108が、(割り当てエントリ208のフィールド201などの)ハンドルに基づいてアロケーションテーブル105の(割り当てエントリ208などの)割り当てエントリを探索し、追跡テーブル106の(追跡エントリ209などの)追跡エントリを参照する(割り当てエントリ208のフィールド203などの)ポインタを取り出すように構成される。次に、メモリデアロケータ108は、例えば追跡エントリのメモリ割り当て数を減分して(追跡エントリ209のフィールド205などの)メモリ解除情報を更新するように構成される。このメモリ割り当て数を使用して、クライアントがメモリブロックの割り当てを要求し、完了した時点でこのメモリブロックを正常に割り当て解除していない(例えばメモリリークの)可能性を示すことができる。この実施形態では、メモリ割り当て数が正の場合、プログラムが、ある期間にわたって、割り当て解除されたメモリブロックよりも多くのメモリブロックを割り当てられている可能性があることを示すことができる。メモリ割り当て数の多いプログラムは、メモリリークの疑いが高いと見なすことができる。1つの実施形態では、メモリマネージャ103が、分析及び/又はレポート目的で、例えばそれぞれのメモリ割り当て数に基づいて、1又はそれ以上のメモリリークの疑いが高いもののリストに関する情報を保持することができる。例えば、図8に示すように、ユーザは、アロケーションテーブル105及び追跡テーブル106からの情報に基づいて、1又はそれ以上のメモリリークの疑いが高いもののバックトレース情報を取得し、この情報を他の機構に送って分析することができる。
【0017】
図3は、本発明の1つの実施形態による、メモリブロックの割り当て方法を示すフロー図である。例えば、方法300は、図1のメモリマネージャ103によって実行することができる。図3を参照すると、ブロック301において、メモリマネージャが、クライアントからメモリブロック割り当て要求を受け取る。ブロック302において、この要求に応答して、メモリマネージャが、要求されたメモリブロックを割り当て、割り当てたメモリブロックの(開始メモリアドレスなどの)ハンドルを取得する。ブロック303において、メモリマネージャは、追跡テーブル内のクライアントに関連するエントリにメモリ割り当て情報を投入する。1つの実施形態では、追跡エントリのメモリ割り当て数を増分する。クライアントは、メモリ割り当てを要求した一連の実行可能コード又はスタックフレームのバックトレースによって表すことができる。ブロック304において、アロケーションテーブル内のメモリ割り当てのハンドルに対応する割り当てエントリ内に追跡エントリのアドレスを記憶する。その後、ブロック305において、メモリ割り当てのハンドルをクライアントに戻してメモリ要求プロセスを完了する。図5は、図3の方法300を実施するプログラムを表す擬似コードである。
【0018】
図4は、本発明の1つの実施形態による、メモリブロックの割り当て解除方法を示すフロー図である。例えば、方法400は、図1のメモリマネージャ103によって実行することができる。図4を参照すると、ブロック401において、メモリマネージャが、ハンドルにより参照されるメモリブロックの解除要求をクライアントから受け取る。ブロック402において、この要求に応答して、メモリマネージャが、このメモリブロックをメモリプールに戻すように構成される。ブロック403において、メモリマネージャがメモリアロケーションテーブルを探索し、ハンドルに基づいて割り当てエントリを探し、このハンドルに対応する追跡テーブルの追跡エントリポインタを識別する。ブロック404において、この追跡エントリポインタに基づいて、メモリマネージャが、例えばメモリ割り当て数を減分することを含め、追跡エントリポインタによりリンクされる追跡エントリに記憶されたメモリ割り当て/割り当て解除情報を更新する。図6は、図4の方法400を実施するプログラムを表す擬似コードである。
【0019】
上述したようなメモリリーク検出機構は、オペレーティングシステムの一部として、或いはオペレーティングシステムのプラグイン又はカーネルの拡張機能として実装することができる。1つの実施形態によれば、誰かがメモリリークを引き起こしている可能性がある時にのみ、このメモリリーク検出機構を作動させることができる。まず1つの実施形態によれば、メモリリーク検出機構は、割り当てに利用できる残りのメモリが所定の閾値を下回るまで作動しない。通常、データ処理システムの起動時には、プログラムへの割り当てに利用できるリソース又はメモリが多く存在する。このような状況下では、メモリリークを追跡する必要はない。1つの実施形態によれば、割り当てに利用できる空きメモリが所定の閾値を下回ると、メモリ検出機構が作動する。多くの場合、データ処理システムではメモリリークが少なく、システムの性能に実質的に影響を及ぼさずにメモリリークを補償するのに十分なリソースが利用可能である。この結果、メモリリークを検出する必要がない場合もある。従って、メモリリーク検出機構は、関連するリソース消費を最小化する必要がある時にのみ作動する。
【0020】
上述したように、メモリ割り当て要求が受け取られると、このようなメモリ割り当てが、上述したようなアロケーションテーブル及び追跡テーブルに記録される。1つの実施形態では、メモリ割り当て要求に応答して、割り当てられたメモリのハンドルに関連するエントリがアロケーションテーブル内で調べられ、この割り当てられたメモリのオーナーに関連するエントリが追跡テーブル内で調べられる。これに応じて、追跡エントリのメモリ割り当て数などのメモリ割り当て情報が更新される。割り当てられたメモリブロックの特定のハンドルに関し、アロケーションテーブル又は追跡テーブル内に対応するエントリが存在しない場合、例えばアロケーションテーブルのエントリに追跡エントリポインタを記憶して、追跡テーブル内の関連する追跡エントリのメモリ割り当て数を増分することにより、アロケーションテーブル又は追跡テーブル内に新たなエントリが割り当てられ又は作成される。
【0021】
同様に、メモリブロックの割り当て解除要求を受け取った場合、関連するメモリ割り当て数を減分して、アロケーションテーブルの関連する割り当てエントリ内の対応する追跡エントリポインタをヌル又はゼロなどの所定の値にリセットすることができる。特定の追跡エントリのメモリ割り当て数がゼロに達した場合、この特定の追跡エントリを他の誰かに自由に割り当てできるということになる。同様に、アロケーションテーブルの特定の割り当てエントリの追跡エントリポインタが有効なエントリポインタを含まない(例えばヌル又はゼロの)場合、この特定の割り当てエントリは自由に割り当てることができる。1つの実施形態によれば、比較的小型のアロケーションテーブル及び/又は追跡テーブルを維持するとともに、簿記に関連するCPUオーバーヘッドを再現するために、メモリ割り当て要求のサンプルのみを記録する。例えば、ポリシーに基づいて構成できるN個のメモリ割り当てのうちの1つを記録することができる。このようにすると、一部のメモリリーク違反者は見つけることができないが、最終的に常習的なメモリリーク違反者が見つかるようになる。この構成では、主なメモリリーク違反者を捕らえることができる一方で、メモリリークの検出に消費されるシステムリソース又は処理電力が少なくて済む。
【0022】
1つの実施形態では、メモリ割り当て及び/又は割り当て解除を要求した一連の実行可能コードのバックトレース(例えば、スタックフレームのバックトレース)により、割り当てたメモリブロックのクライアント又はオーナーを表すことができる。アロケーションテーブル内のエントリの各々は、メモリ割り当てのハンドルのハッシュ値に基づいてインデックスを付けられる。追跡テーブル内のエントリの各々は、メモリ割り当て及び/又は割り当て解除を要求したプログラムのバックトレースのハッシュ値に基づいてインデックスを付けられる。この結果、メモリマネージャは、バックトレース及びこれらのメモリ割り当て数に基づいて、実行可能コードのいずれの行がメモリリークを引き起こす可能性があるかを特定することができる。
【0023】
再び図1及び図2を参照すると、バックトレースモジュール109によってプログラム101〜102のいずれかのバックトレースを取得し、これをメモリマネージャ103に提供することができる。バックトレースモジュール109は、APIを介して、メモリの割り当て又は割り当て解除を要求した最新のスレッドのスタックフレームのバックトレースをメモリマネージャが取得できるようにする、オペレーティングシステムのカーネルの拡張機能として実装することができる。図8に、分析モジュール110がメモリ使用状況レポート111(例えば、メモリリークレポート)の一部としてレポートできるバックトレースの例を示している。このメモリ使用状況レポート111を動的に又はオフラインでさらに分析して、システム100に現在インストールされているどのプログラムが大部分のメモリリークを引き起こしているかを特定することができる。
【0024】
図2を参照して分かるように、アロケーションテーブル105及び追跡テーブル106は、アレイ、データ構造、データオブジェクト、又はこれらの組み合わせ(例えば、データ構造のリンクリスト)などの様々な形で実装することができる。1つの実施形態では、アロケーションテーブル105が、割り当てたメモリブロックに関連するメモリアドレスのハッシュ値に基づいてインデックスを付けられた複数のエントリを含む。例えば、メモリブロックを割り当てる際に、メモリブロックのハンドルを取得する。このハンドルのハッシュに基づいてアロケーションテーブル105のエントリが識別され、このハッシュは、様々なハッシュ関数、又はJenkins、FNV、SHA−1又はMD5ハッシュアルゴリズムなどのアルゴリズムを使用して生成することができる。すなわち、ハンドルのハッシュ値を取得すると、このハッシュ値をフィールド201のインデックスとして利用して、アロケーションテーブル105内のエントリを探すことができる。1つの実施形態では、アロケーションテーブル105の各エントリが、メモリ割り当ての実際のハンドル又はメモリアドレスを記憶するためのフィールド202、及び追跡テーブル106の追跡エントリを参照するポインタを記憶するためのフィールド203をさらに含む。アロケーションテーブル105には、その他の情報を記憶することもできる。
【0025】
同様に、1つの実施形態によれば、追跡テーブル106は、メモリ割り当て又は割り当て解除を要求するクライアント又はオーナーを表すバックトレースのハッシュ値に基づいてインデックスを付けられた複数のエントリを含む。例えば、あるクライアントにメモリブロックが割り当てられると、このクライアントのバックトレースがオペレーティングシステムから(バックトレースモジュール109などを介して)取得される。このバックトレースのハッシュに基づいて追跡テーブル106のエントリが識別され、このハッシュは、様々なハッシュ関数、又はJenkins、FNV、SHA−1、又はMD5ハッシュアルゴリズムなどのアルゴリズムを使用して生成することができる。すなわち、バックトレースのハッシュ値を取得すると、このハッシュ値をフィールド204のインデックスとして利用して、追跡テーブル106内のエントリを探すことができる。1つの実施形態では、追跡テーブル106の各エントリが、例えばメモリ割り当て数などの、エントリに関連するメモリ割り当て情報を記憶するためのフィールド205をさらに含む。追跡テーブル106の各エントリは、そのエントリに関連する実際のバックトレースなどのその他の情報を記憶するためのフィールド206をさらに含む。追跡テーブル106には、その他の情報を記憶することもできる。
【0026】
図2に示すように、1つの実施形態によれば、アロケーションテーブル105のインデックスとしてハンドルのハッシュ、及び追跡テーブル106のインデックスとしてバックトレースのハッシュを使用することにより、アロケーションテーブル105及び追跡テーブル106のサイズを適当なサイズに維持することができる。すなわち、アロケーションテーブル105及び追跡テーブル106の各々は、ハンドルのハッシュ及びバックトレースのハッシュにそれぞれ基づいて識別され又は見つけ出された一定数のエントリ又はスロットを含む。しかしながら、(ハンドル又はバックトレースなどの)異なる値のハッシュから同じハッシュ値が生じることもある(例えば、ハッシュの衝突)。この結果、アロケーションテーブル105のエントリ207〜208などの複数のエントリが、追跡テーブル106の同じ追跡エントリ209を参照できることもある。いくつかの実施形態によれば、ある状況下では、アロケーションテーブル105及び追跡テーブル106によって消費されるリソースを制限するために、アロケーションテーブル105及び追跡テーブル106に一部のメモリ割り当てを記録しなくてもよい。システムは、総エントリ数までのメモリ割り当てのみをアロケーションテーブル105及び追跡テーブル106に記録することができる。状況によっては、新たなメモリ割り当てが記録されると、同じスロットを占めている先に記録されていたメモリ割り当てが、状況に応じてテーブルから排除され又はテーブル内で無効になる。上述したように、特定の時点に一部のメモリリーク違反者を捕らえることはできないが、最終的に常習的なメモリリーク違反者が捕らえられるようになる。
【0027】
図7は、本発明の別の実施形態によるメモリ割り当て方法を示すフロー図である。方法700は、ソフトウェア、ハードウェア、又はこれらの組み合わせに処理ロジックとして実装できる図1のメモリマネージャ103によって実行することができる。図2及び図7を参照すると、ブロック701において、ハンドルにより参照されるメモリ割り当てに応答して、処理ロジックが、メモリ割り当てを要求したプログラムのハンドルのハッシュ及びバックトレースのハッシュを取得し、アロケーションテーブル105及び追跡テーブル106を探索する。ブロック702において、処理ロジックは、アロケーションテーブル105の割り当てエントリを、バックトレースによって表されるクライアントに自由に割り当てできるどうかを判定する。1つの実施形態では、処理ロジックが、ハンドルのハッシュをインデックスとして使用して、アロケーションテーブル105のフィールド201内を探索し、割り当てエントリを見つけ出す。次に、処理ロジックは、この割り当てエントリのフィールド203を調べて、このフィールド内に記憶された追跡エントリポインタが存在するかどうかを判定する。フィールド内に記憶された追跡エントリポインタが存在しない場合、この割り当てエントリは自由に使用できると見なされる。
【0028】
割り当てエントリが空いていると判定された場合、ブロック703において、処理ロジックは、バックトレースのハッシュをフィールド204内でインデックスとして使用して追跡テーブル106を探索し、追跡エントリを見つけ出す。次に、処理ロジックは、この追跡エントリのフィールド205を調べて、追跡エントリが空いているかどうかを判定する。1つの実施形態では、フィールド205がいくつかのメモリ割り当て情報を含む場合、この例ではメモリ割り当て数が非ゼロである場合、追跡エントリは塞がっており、非ゼロでなければ追跡エントリは空いている。追跡エントリが空いている(例えば、現在のメモリ割り当てが新たなメモリ割り当てであって初めて記録される)と判定された場合、ブロック704において、処理ロジックは、アロケーションテーブル105及び追跡テーブル106の両方に必要な情報を投入する。1つの実施形態では、処理ロジックが、実際のメモリハンドルをアロケーションテーブル105内の割り当てエントリのフィールド202に記憶し、関連する追跡エントリのメモリアドレスを割り当てエントリのフィールド203に記憶する。また、処理ロジックは、実際のバックトレースの少なくとも一部を追跡エントリのフィールド206にさらに記憶して、追跡テーブル106内の追跡エントリのフィールド205のメモリ割り当て数を増分する。1つの実施形態では、追跡テーブル106のサイズを制限するために、(15行などの所定数のコード又はスタックフレームなどの)バックトレースの限られた量の情報のみを追跡エントリのフィールド206に記憶する。追跡エントリのメモリアドレスを割り当てエントリのフィールド203に記憶することにより、この割り当てエントリは塞がっていると見なされる。同様に、非ゼロのメモリ割り当て数を追跡エントリのフィールド205に記憶することにより、この追跡エントリが塞がるようになる。
【0029】
1つの実施形態によれば、ブロック703において追跡エントリが塞がっている(例えば、メモリ割り当て数が非ゼロである)と判定された場合、ブロック705において、処理ロジックは、この追跡エントリが同じオーナー又はクライアントに関連するものであるかどうかを判定する。1つの実施形態では、処理ロジックが、メモリ割り当てを要求している現在のスレッドの実際のバックトレースを、現在追跡エントリのフィールド206に記憶されているバックトレースと比較する。これらの両バックトレースが一致する場合、この追跡エントリは同じオーナーにより所有されている。追跡エントリが同じオーナーにより所有されている場合、ブロック706において、追跡エントリのフィールド205に記憶されたメモリ割り当て数を増分する。ブロック707において、追跡エントリのメモリアドレスを割り当てエントリのフィールド203に記憶し、これにより、この割り当てエントリが現在塞がっていることを示す。
【0030】
なお、この時点で、同じ追跡エントリを参照する割り当てエントリが複数存在することもある。例えば、追跡エントリのメモリ割り当て数が2の場合、追跡テーブル106の対応する追跡エントリに関連するアロケーションテーブル105内に少なくとも2つの割り当てエントリが存在する可能性がある。すなわち、あるオーナーに複数のメモリブロックが割り当てられ、これらの一部が解放されていない可能性がある。例えば、図2を参照すると、バックトレースによって表されるオーナーに第1のメモリブロックが割り当てられ、この結果、(第1のハンドルに基づく)割り当てエントリ207が追跡エントリ209を参照していると想定される。その後、同じオーナー(例えば同じバックトレース)に第2のメモリブロックが割り当てられ、この結果、(第2のハンドルに基づく)割り当てエントリ208が(バックトレースが同じであるため)同じ追跡エントリ209を参照するようになる。この結果、両割り当てエントリ207〜208が、メモリ割り当て数が2である同じ追跡エントリを参照するようになる。
【0031】
1つの実施形態によれば、ブロック702において、割り当てエントリが塞がっていると判定された場合、ブロック708において、処理ロジックは、この割り当てエントリにより参照される追跡エントリを調べて、(上述したようにバックトレースを比較することにより)この追跡エントリが同じオーナーによって所有されているかどうかを判定する。また、処理ロジックは、実際のハンドルを割り当てエントリのフィールド202に記憶されているハンドルとさらに比較して、このメモリ割り当てが既に記録されているメモリ割り当てと同じものであるかどうかを判定することができる。このメモリ割り当てが同じオーナー又は同じハンドルのものである場合、このメモリ割り当ては既に処理されているので、処理ロジックは、現在のメモリ割り当て処理をスキップすることができる。このメモリ割り当てが同じオーナーのものでない場合、ブロック709において、この新たなオーナーに追跡テーブル106から新たな追跡エントリが割り当てられる。また、フィールド203内の追跡エントリポインタを新たな追跡エントリのアドレスに置き替え、この新たな追跡エントリのメモリ割り当て数を増分する。なお、この時点で、割り当てエントリは、古い追跡エントリの代わりに新たな追跡エントリにリンクされる。ブロック710において、追跡テーブル106内の古い追跡エントリのメモリ割り当て数を減分する。
【0032】
図9は、本発明の1つの実施形態とともに使用できるデータ処理システムのブロック図である。例えば、システム900は、図1に示すシステム100の一部として使用することができる。なお、図9には、コンピュータシステムの様々な構成要素を示しているが、これらの構成要素を相互接続する特定のアーキテクチャ又は態様は本発明に密接に関係しないので、このような詳細を示すことは意図していない。より少ない又はより多くの構成要素を有するネットワークコンピュータ、ハンドヘルドコンピュータ、携帯電話機、及びその他のデータ処理システムを本発明とともに使用できることも理解されるであろう。図9のコンピュータシステムは、例えば、Apple社のMacintoshコンピュータ又はMacBook、IBM互換PC、又はコンピュータサーバとすることができる。
【0033】
図9に示すように、データ処理システムの1つの形態であるコンピュータシステム900は、1又はそれ以上のマイクロプロセッサ903及びROM907、揮発性RAM905及び不揮発性メモリ906に結合されたバス又は相互接続部902を含む。マイクロプロセッサ903は、キャッシュメモリ904に結合される。バス902は、これらの様々な構成要素を互いに相互接続するとともに、これらの構成要素903、907、905及び906をディスプレイコントローラ及びディスプレイ装置908に、並びにマウス、キーボード、モデム、ネットワークインターフェイス、プリンタ及び当業で周知のその他の装置とすることができる入力/出力(I/O)装置910にも相互接続する。
【0034】
通常、入力/出力装置910は、入力/出力コントローラ909を介してシステムに結合される。通常、揮発性RAM905は、メモリ内のデータを更新又は維持するために継続的に電力を必要とするダイナミックRAM(DRAM)として実装される。通常、不揮発性メモリ906は、磁気ハードドライブ、光磁気ドライブ、光ドライブ、又はDVD RAM、又はシステムから電力が除去された後でもデータを維持するその他の種類のメモリシステムである。通常、不揮発性メモリはランダムアクセスメモリであるが、これは必須ではない。
【0035】
図9には、不揮発性メモリがデータ処理システム内のその他の構成要素に直接結合されたローカルデバイスであることを示しているが、本発明は、モデム又はイーサネット(登録商標)インターフェイスなどのネットワークインターフェイスを介してデータ処理システムに結合されたネットワーク記憶装置などの、システムから遠隔にある不揮発性メモリを利用することもできる。バス902は、当業で周知の様々なブリッジ、コントローラ及び/又はアダプタを介して互いに接続された1又はそれ以上のバスを含むことができる。1つの実施形態では、I/Oコントローラ909が、USB周辺機器を制御するためのUSB(ユニバーサルシリアルバス)アダプタを含む。或いは、I/Oコントローラ909は、FireWire装置を制御するための、FireWireアダプタとしても知られているIEEE1394アダプタを含むことができる。
【0036】
上述した詳細な説明の一部は、コンピュータメモリ内のデータビットにおける演算のアルゴリズム及び記号表現の観点から示したものである。これらアルゴリズムによる記述及び表現は、データ処理における当業者が自らの研究内容を他の当業者に最も効果的に伝えるために使用する方法である。本明細書では、及び一般的に、アルゴリズムとは、望ましい結果をもたらす首尾一貫した一連の演算であると考えられる。これらの演算は、物理量の物理的操作を必要とするものである。
【0037】
しかしながら、これらの及び同様の用語は、全て適当な物理量に関連付けられるべきものであり、またこれらの量に与えられた便利な表記に過ぎないことに留意されたい。上述の説明から明らかなように、特に別途述べていない限り、本発明全体を通じ、以下の特許請求の範囲に記載するような用語を利用した説明は、コンピュータシステムのレジスタ及びメモリ内の物理(電子)量として表されるデータを操作し、コンピュータシステムのメモリ、レジスタ、又はその他のこのような情報記憶装置、送信又は表示装置内の物理量として同様に表される他のデータに変換するコンピュータシステム又は同様の電子コンピュータ装置の動作及び処理を意味するものである。
【0038】
図示の技術は、1又はそれ以上の電子装置上に記憶され実行されるコード及びデータを使用して実現することができる。このような電子装置は、(磁気ディスク、光ディスク、ランダムアクセスメモリ、読み取り専用メモリ、フラッシュメモリデバイス、相変化メモリなどの)非一時的コンピュータ可読記憶媒体及び(電気信号、光信号、音響信号、又は搬送波、赤外線信号、デジタル信号などのその他の形の伝搬信号などの)一時的コンピュータ可読伝送媒体などのコンピュータ可読媒体を使用してコード及びデータを記憶し(内部的に及び/又はネットワークを介して他の電子装置と)通信する。
【0039】
上述した図に示すプロセス又は方法は、(回路、専用ロジックなどの)ハードウェア、ファームウェア、(非一時的コンピュータ可読媒体上で具体化されるような)ソフトウェア、又はこれらの組み合わせを含むロジックを処理することにより実施することができる。上記では、これらのプロセス又は方法をいくつかの順次処理の観点から説明したが、説明した動作の一部を異なる順序で実行することもできると理解されたい。さらに、動作によっては、順次的にではなく同時に実行できるものもある。
【0040】
上述の明細書では、本発明の実施形態をその特定の例示的な実施形態を参照しながら説明した。特許請求の範囲に示す本発明の幅広い思想及び範囲から逸脱することなく本発明に様々な修正を行えることが明白であろう。従って、明細書及び図面は、限定的な意味ではなく例示的な意味で捉えるべきである。

【特許請求の範囲】
【請求項1】
コンピュータで実施されるメモリ管理方法であって、
メモリアロケーションテーブル内で第1の探索動作を実行して、クライアントに割り当てられたメモリブロックのメモリアドレスを表すハンドルに基づいて割り当てエントリを識別し、該割り当てエントリから追跡エントリポインタを取り出すステップと、
メモリ追跡テーブル内で第2の探索動作を実行して、前記追跡エントリポインタに基づいて追跡エントリを識別し、該追跡エントリのメモリ割り当て数を増分するステップと、
を含み、前記メモリの割り当て数を利用して、前記クライアントがメモリリークを引き起こす可能性を示す、
ことを特徴とする方法。
【請求項2】
前記クライアントが、プログラムの一連の実行可能コードのバックトレースを介して識別され、前記追跡エントリが、前記バックトレースのハッシュ値に基づいて前記メモリ追跡テーブル内でインデックスを付けられる、
ことを特徴とする請求項1に記載の方法。
【請求項3】
前記メモリアロケーションテーブルの前記割り当てエントリが、前記ハンドルのハッシュ値に基づいてインデックスを付けられる、
ことを特徴とする請求項1に記載の方法。
【請求項4】
前記割り当てエントリを調べて、該割り当てエントリが追跡エントリポインタを含むかどうかを判定することにより、前記割り当てエントリが使用のために空いているかどうかを判定するステップと、
前記割り当てエントリが空いている場合、前記メモリ追跡テーブルの前記追跡エントリのアドレスを使用して前記割り当てエントリを更新するステップと、
をさらに含むことを特徴とする請求項1に記載の方法。
【請求項5】
前記割り当てエントリが空いている場合、前記メモリ追跡テーブルの前記追跡エントリを調べて、前記メモリ割り当て数が所定値よりも大きいかどうかを判定するステップと、
前記メモリ割り当て数が所定値よりも大きい場合、前記クライアントが前記メモリ追跡テーブルの前記追跡エントリのオーナーと同じであるどうかを判定するステップと、
をさらに含み、前記クライアントが前記追跡エントリのオーナーと同じである場合、前記追跡エントリの前記メモリ割り当て数を増分する、
ことを特徴とする請求項4に記載の方法。
【請求項6】
前記割り当てエントリが空いておらず、既存の追跡エントリを参照する場合、前記クライアントが前記メモリ追跡テーブルの前記追跡エントリのオーナーと同じであるかどうかを判定するステップと、
前記クライアントが前記オーナーと同じでない場合、
前記既存の追跡エントリのメモリ割り当て数を減分するステップと、
前記追跡エントリのアドレスを使用して前記メモリアロケーションテーブルの前記割り当てエントリを更新するステップと、
を含むことを特徴とする請求項4に記載の方法。
【請求項7】
第2のハンドルによって識別される第2のメモリブロックの割り当て解除要求に応答して、前記第2のハンドルに基づいて、前記メモリアロケーションテーブルの第2の割り当てエントリから第2の追跡エントリポインタを取り出すステップと、
前記第2の追跡エントリポインタに基づいて前記メモリ追跡テーブルの第2の追跡エントリのメモリ割り当て数を減分するステップと、
をさらに含むことを特徴とする請求項1に記載の方法。
【請求項8】
前記第1及び第2の探索動作が、メモリ割り当て要求のサンプルに対してのみ実行される、
ことを特徴とする請求項1に記載の方法。
【請求項9】
機械による実行時に、前記機械にメモリの管理方法を実行させる命令を記憶した機械可読記憶媒体であって、前記方法が、
メモリアロケーションテーブル内で第1の探索動作を実行して、クライアントに割り当てられたメモリブロックのメモリアドレスを表すハンドルに基づいて割り当てエントリを識別し、該割り当てエントリから追跡エントリポインタを取り出すステップと、
メモリ追跡テーブル内で第2の探索動作を実行して、前記追跡エントリポインタに基づいて追跡エントリを識別し、該追跡エントリのメモリ割り当て数を増分するステップと、
を含み、前記メモリの割り当て数を利用して、前記クライアントがメモリリークを引き起こす可能性を示す、
ことを特徴とする機械可読記憶媒体。
【請求項10】
前記クライアントが、プログラムの一連の実行可能コードのバックトレースを介して識別され、前記追跡エントリが、前記バックトレースのハッシュ値に基づいて前記メモリ追跡テーブル内でインデックスを付けられる、
ことを特徴とする請求項9に記載の機械可読記憶媒体。
【請求項11】
前記メモリアロケーションテーブルの前記割り当てエントリが、前記ハンドルのハッシュ値に基づいてインデックスを付けられる、
ことを特徴とする請求項9に記載の機械可読記憶媒体。
【請求項12】
前記方法が、
前記割り当てエントリを調べて、該割り当てエントリが追跡エントリポインタを含むかどうかを判定することにより、前記割り当てエントリが使用のために空いているかどうかを判定するステップと、
前記割り当てエントリが空いている場合、前記メモリ追跡テーブルの前記追跡エントリのアドレスを使用して前記割り当てエントリを更新するステップと、
をさらに含むことを特徴とする請求項9に記載の機械可読記憶媒体。
【請求項13】
前記方法が、
前記割り当てエントリが空いている場合、前記メモリ追跡テーブルの前記追跡エントリを調べて、前記メモリ割り当て数が所定値よりも大きいかどうかを判定するステップと、
前記メモリ割り当て数が所定値よりも大きい場合、前記クライアントが前記メモリ追跡テーブルの前記追跡エントリのオーナーと同じであるどうかを判定するステップと、
をさらに含み、前記クライアントが前記追跡エントリのオーナーと同じである場合、前記追跡エントリの前記メモリ割り当て数を増分する、
ことを特徴とする請求項12に記載の機械可読記憶媒体。
【請求項14】
前記方法が、
前記割り当てエントリが空いておらず、既存の追跡エントリを参照する場合、前記クライアントが前記メモリ追跡テーブルの前記追跡エントリのオーナーと同じであるかどうかを判定するステップと、
前記クライアントが前記オーナーと同じでない場合、
前記既存の追跡エントリのメモリ割り当て数を減分するステップと、
前記追跡エントリのアドレスを使用して前記メモリアロケーションテーブルの前記割り当てエントリを更新するステップと、
を含むことを特徴とする請求項12に記載の機械可読記憶媒体。
【請求項15】
メモリアロケーションテーブル及びメモリ追跡テーブルを記憶するためのメモリと、
前記メモリアロケーションテーブル内で第1の探索動作を実行して、クライアントに割り当てられたメモリブロックのメモリアドレスを表すハンドルに基づいて割り当てエントリを識別し、該割り当てエントリから追跡エントリポインタを取り出すためのメモリ割り当てモジュールと、
を備え、前記メモリ割り当てモジュールが、前記メモリ追跡テーブル内で第2の探索動作を実行して、前記追跡エントリポインタに基づいて追跡エントリを識別し、該追跡エントリのメモリ割り当て数を増分するように構成され、前記メモリの割り当て数を利用して、前記クライアントがメモリリークを引き起こす可能性を示す、
ことを特徴とするデータ処理システム。
【請求項16】
前記クライアントが、プログラムの一連の実行可能コードのバックトレースを介して識別され、前記追跡エントリが、前記バックトレースのハッシュ値に基づいて前記メモリ追跡テーブル内でインデックスを付けられる、
ことを特徴とする請求項15に記載のシステム。
【請求項17】
前記メモリアロケーションテーブルの前記割り当てエントリが、前記ハンドルのハッシュ値に基づいてインデックスを付けられる、
ことを特徴とする請求項15に記載のシステム。
【請求項18】
前記メモリ割り当てモジュールが、
前記割り当てエントリを調べて、前記割り当てエントリが追跡エントリポインタを含むかどうかを判定することにより、前記割り当てエントリが使用のために空いているかどうかを判定し、
前記割り当てエントリが空いている場合、前記メモリ追跡テーブルの前記追跡エントリのアドレスを使用して前記割り当てエントリを更新する、
ように構成されることを特徴とする請求項15に記載のシステム。
【請求項19】
前記メモリ割り当てモジュールが、
前記割り当てエントリが空いている場合、前記メモリ追跡テーブルの前記追跡エントリを調べて、前記メモリ割り当て数が所定値よりも大きいかどうかを判定し、
前記メモリ割り当て数が所定値よりも大きい場合、前記クライアントが前記メモリ追跡テーブルの前記追跡エントリのオーナーと同じであるどうかを判定し、前記クライアントが前記追跡エントリのオーナーと同じである場合、前記追跡エントリの前記メモリ割り当て数を増分する、
ように構成されることを特徴とする請求項18に記載のシステム。
【請求項20】
前記メモリ割り当てモジュールが、
前記割り当てエントリが空いておらず、既存の追跡エントリを参照する場合、前記クライアントが前記メモリ追跡テーブルの前記追跡エントリのオーナーと同じであるかどうかを判定し、
前記クライアントが前記オーナーと同じでない場合、
前記既存の追跡エントリのメモリ割り当て数を減分し、
前記追跡エントリのアドレスを使用して前記メモリアロケーションテーブルの前記割り当てエントリを更新する、
ように構成されることを特徴とする請求項19に記載のシステム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate