-
Notifications
You must be signed in to change notification settings - Fork 0
MS_Heap
nishi_74322014 edited this page Aug 3, 2026
·
1 revision
- TOP > インフラストラクチャ > メモリ管理
ヒープ = ヒープ・マネージャは予めある程度の仮想アドレス空間を予約しておき、
プログラムから要求がされ次第、その予約された仮想アドレス空間に物理メモリを確保する。
このため、仮想アドレス空間に異なる小さな物理メモリを多数割り当てるときに性能が良い。
ただし、大量の異なるサイズの領域確保・解放を繰り返す場合は、断片化が発生する。
- ADO(MDAC)を使用して、大量データの結果セットを取得・解放を繰り返すプログラムで
断片化が発生した事例がある。 - このメモリリークは、内部的には「COMのメモリ・リーク」ではなく、
ADO(MDAC)の追加メモリを倍々で Reserved するアルゴリズムに起因していた。
Windows Server 2008 からは、ヒープ・マネージャは低断片化ヒープ
LFH(Low Fragmentation Heap)がデフォルトで ON に設定されている。
- 仮想アドレス空間のブロックのサイズの大小が影響して、断片化が問題になる。
このため実際にコミットできるのは仮想アドレス空間の半分程度になることもある。 - Windows Server 2008 / Vista ではデフォルト ON
- Windows XP や Windows Server 2003 の場合、
LFH を有効にするにはHeapSetInformation関数を使う。
※ LFH は同じサイズのブロックをまとめて管理することで断片化を抑える仕組み。
一方、要求サイズが 16KB を超えるものは LFH の対象外で、通常のヒープが使われる。
ヒープ・マネージャと対応するインスタンス(ハンドラ)的な。
- プロセスの起動時には、ヒープは既定でひとつ用意される。
- プロセス・ヒープ(あるいはデフォルト・ヒープ、プロセス・デフォルト・ヒープ)
-
GetProcessHeap()で取得できる。
- 自前で作ったヒープ(
HeapCreate()) - パフォーマンスの観点からヒープを独自に作成する。
※ 用途ごとにヒープを分けると、
- 一括破棄(
HeapDestroy)でまとめて解放できる、 - 他の用途の割り当てと混ざらないので断片化しにくい、
といった利点がある。
補足: ここで説明しているのは Win32 のヒープ(
HeapAlloc)。 .NET のマネージド ヒープ(GC ヒープ)は別物で、 圧縮(コンパクション)を行うため通常の世代別ヒープは断片化しにくい (例外は LOH。.NETのメモリ・リークを参照)。なお、デスクトップ・ヒープも名前は「ヒープ」だが、 カーネル側のセッション空間にある別の領域で、ここでの話とは無関係。
Tags: 障害対応, 性能, デバッグ
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。