Skip to content

MS_Heap

nishi_74322014 edited this page Aug 3, 2026 · 1 revision

ヒープ

概要

ヒープ = ヒープ・マネージャは予めある程度の仮想アドレス空間を予約しておき、
プログラムから要求がされ次第、その予約された仮想アドレス空間に物理メモリを確保する。
このため、仮想アドレス空間に異なる小さな物理メモリを多数割り当てるときに性能が良い。

詳細

断片化

ただし、大量の異なるサイズの領域確保・解放を繰り返す場合は、断片化が発生する。

事例

  • ADO(MDAC)を使用して、大量データの結果セットを取得・解放を繰り返すプログラムで
    断片化が発生した事例がある。
  • このメモリリークは、内部的には「COMのメモリ・リーク」ではなく、
    ADO(MDAC)の追加メモリを倍々で Reserved するアルゴリズムに起因していた。

低断片化ヒープ(LFH)

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: 障害対応, 性能, デバッグ

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally