Open棟梁Project - マイクロソフト系技術情報 Wiki
目次  †
概要  †
良くあるメモリ・リークの事例と、関連する基礎用語・知識
メモリ・リークでのメモリ不足  †
プログラム上の問題。
設計上の問題  †
- 大量データをキャッシュ
 
- 不要なデータ(列など)を取得
 
- 大量の結果セットを取得(SELECT文)
 
- 巨大なDLL、Assembly(本来分割すべきもの)
 
実装上の問題  †
不要なオブジェクトのコピー  †
そもそも処理に不要なメモリを無駄に確保している状態。
メモリ・オブジェクトの開放漏れ  †
不要になったメモリを無駄に確保し続けている状態。
- リソースリーク、ハンドルリーク
- メモリ以外のリソースリーク。
 
- ハンドルのリークという形で確認できる。
 
- スレッドのリークはスタック(メモリ)のリークにも繋がる。
 
 
設計上の問題でもあり、実装上の問題でもある(ヒープ・マネージャに任せた結果)。
仮想アドレス空間のブロックのサイズの大小が影響して、ヒープの断片化が問題になる。
断片化により、実際にコミットできるのは仮想アドレス空間の半分程度になることもある。
メモリ・リーク以外でのメモリ不足  †
システム上の問題。
ページ プールと非ページ プールのトリミングが間に合わない。  †
利用率80%を超えてから開始されるトリミングが、大量の一時オブジェクトの作成に間に合わない事がある。
ディスクへの書き込みが間に合わない。  †
- 遅延書き込みキャッシュが影響してメモリ不足が発生することがある。
 
irpstacksize拡張の判断基準  †
- IO要求はIRPとIRPスタックというデータ構造で受け渡される。
 
- IRPスタックのサイズが不足してデバイスが使用できなくなることがある。
 
カーネル メモリ スペース縮小の影響  †
- 32bitOSにて3GBスイッチを適用することで、カーネル メモリ スペースが2GBから1GBに縮小される影響。
 
- また、32bitOSに多くの物理メモリを搭載すると物理メモリと仮想メモリのマップ情報を管理する
カーネル メモリ スペース(PTE)が圧迫される。
 
Large Pageの影響  †
Large Pageの確保のトリミングが完了するまでシステムが応答しなくなる。
ESENTキャッシュの影響(ドメインコントローラ)  †
ESENTキャッシュがlsass.exeのメモリリークの原因となっている事がある。