-
Notifications
You must be signed in to change notification settings - Fork 0
MS_MemoryLeak
良くあるメモリ・リークの事例と、関連する基礎用語・知識
プログラム上の問題。
- 大量データをキャッシュ
- 不要なデータ(列など)を取得
- 大量の結果セットを取得(SELECT文)
- 巨大なDLL、Assembly(本来分割すべきもの)
そもそも処理に不要なメモリを無駄に確保している状態。
不要になったメモリを無駄に確保し続けている状態。
- リソースリーク、ハンドルリーク
- メモリ以外のリソースリーク。
- ハンドルのリークという形で確認できる。
- スレッドのリークはスタック(メモリ)のリークにも繋がる。
- メモリ・リーク
設計上の問題でもあり、実装上の問題でもある(ヒープ・マネージャに任せた結果)。
仮想アドレス空間のブロックのサイズの大小が影響して、ヒープの断片化が問題になる。
断片化により、実際にコミットできるのは仮想アドレス空間の半分程度になることもある。
※ 断片化は 32bit プロセス(ユーザ空間 2GB)で特に問題になりやすい。
64bit 化すればアドレス空間が広がるため、断片化に起因する OutOfMemory は起きにくくなる。
システム上の問題。
利用率80%を超えてから開始されるページ プールと非ページ プールの
トリミングが、大量の一時オブジェクトの作成に間に合わない事がある。
- 遅延書き込みキャッシュが影響してメモリ不足が発生することがある。
- 大きなファイル(数百MB以上)をコピーする場合、
全体的なシステム パフォーマンスの低下が発生する可能性がある。
- IO要求は IRP と IRPスタック というデータ構造で受け渡される。
- IRPスタックのサイズが不足してデバイスが使用できなくなることがある。
- ウイルス対策ソフトウェアが原因でイベント ID 2011 が発生することがある。
- 32bit OS にて 3GB スイッチを適用することで、カーネル メモリ スペースが 2GB から 1GB に縮小される影響。
- また、32bit OS に多くの物理メモリを搭載すると、
物理メモリと仮想メモリのマップ情報を管理するカーネル メモリ スペース(PTE)が圧迫される。
※ いずれも 32bit OS 固有の制約。64bit OS では該当しない。
Large Page の確保のトリミングが完了するまでシステムが応答しなくなる。
※ Large Page は連続した物理メモリを要求するため、
断片化した状態では確保に時間がかかる(SQL Server の Lock Pages in Memory 等で問題になりうる)。
ESENT キャッシュが lsass.exe のメモリリークの原因となっている事がある。
※ ESENT は AD のデータベース エンジン(LDAPの項も参照)。
DC で lsass.exe のワーキング セットが大きいこと自体は正常なキャッシュ動作のこともあり、
「増え続けて解放されない」かどうかで判断する。
-
リークしているのがどの領域かを切り分ける。
- プロセスのプライベート バイト(ユーザモード)→ アプリのリーク
- ページ/非ページ プール(カーネル)→ ドライバのリーク
- ハンドル数 → ハンドル リーク
- パフォーマンス カウンタで継続的に採取するのが基本。
- マネージドか、アンマネージドかを判定する(.NETのメモリ・リーク)。
- ハング・ダンプを時間をおいて複数回取得し、増えているオブジェクトを比較する。
Tags: Windows, メモリ管理, 障害対応, 性能, デバッグ
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。