「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>メモリ管理]] * 目次 [#pd517675] #contents *概要 [#g45d5ce6] -ヒープ = ヒープ・マネージャは予めある程度の仮想アドレス空間を予約しておき、~ プログラムから要求がされ次第、その予約された仮想アドレス空間に物理メモリを確保する。~ このため、仮想アドレス空間に異なる小さな物理メモリを多数割り当てるときに性能が良い。~ *断片化 [#p3c84506] *詳細 [#ydadfc6b] **断片化 [#p3c84506] ただし、大量の異なるサイズの領域確保・解放を繰り返す場合は、断片化が発生する。~ **事例 [#z4a64577] ***事例 [#z4a64577] -ADO(MDAC)を使用して、大量データの結果セットを取得・解放を繰り替えすプログラムで断片化が発生した事例がある。~ -このメモリリークは、内部的には「[[COMのメモリ・リーク]]」ではなく、ADO(MDAC)の追加メモリを倍々でReservedするアルゴリズムに起因していた。 **低断片化ヒープ(LFH) [#p78b641c] ***低断片化ヒープ(LFH) [#p78b641c] Windows Server 2008からは、ヒープ・マネージャは低断片化ヒープ~ LFH(Low Fragmentation Heap)がデフォルトでONに設定されている。 -低断片化ヒープ(Low Fragmentation Heap) ≪ re-Think things~ http://togarasi.wordpress.com/2009/01/14/%e4%bd%8e%e6%96%ad%e7%89%87%e5%8c%96%e3%83%92%e3%83%bc%e3%83%97%ef%bc%88low-fragmentation-heap%ef%bc%89/ >仮想アドレス空間のブロックのサイズの大小が影響して、断片化が問題になる。~ このため実際にコミットできるのは仮想アドレス空間の半分程度になることもある。 --Windows Server 2008/Vista ではデフォルト ON --Windows XP や Windows Server 2003 の場合~ LFH を有効にするには、HeapSetInformation関数を使う。 *プロセス・ヒープとプライベート・ヒープ [#o4ae5997] **プロセス・ヒープとプライベート・ヒープ [#o4ae5997] ヒープ・マネージャと対応するインスタンス(ハンドラ)的な。 **プロセス・ヒープ [#i21d816f] ***プロセス・ヒープ [#i21d816f] -プロセスの起動時には、ヒープは既定でひとつ用意される。 -プロセス・ヒープ (あるいはデフォルト・ヒープ、プロセス・デフォルト・ヒープ **プライベート・ヒープ [#w2ed845b] ***プライベート・ヒープ [#w2ed845b] -自前で作ったヒープ -パフォーマンスの観点からヒープを独自に作成する。 *参考 [#kea438e2] -[[仮想アドレス空間の確保のAPI]] -ヒープに関する話題 - Web-DB プログラミング徹底解説~ http://keicode.com/windows/win11.php -インサイド Microsoft Windows 第4版のヒープマネージャの概論 ---- Tags: [[:障害対応]], [[:性能]], [[:デバッグ]]