Skip to content

MS_MemoryLeak

nishi_74322014 edited this page Aug 3, 2026 · 1 revision

メモリ・リーク

概要

良くあるメモリ・リークの事例と、関連する基礎用語・知識

メモリ・リークでのメモリ不足

プログラム上の問題。

設計上の問題

  • 大量データをキャッシュ
  • 不要なデータ(列など)を取得
  • 大量の結果セットを取得(SELECT文)
  • 巨大なDLL、Assembly(本来分割すべきもの)

実装上の問題

不要なオブジェクトのコピー

そもそも処理に不要なメモリを無駄に確保している状態。

メモリ・オブジェクトの開放漏れ

不要になったメモリを無駄に確保し続けている状態。

ヒープの断片化

設計上の問題でもあり、実装上の問題でもある(ヒープ・マネージャに任せた結果)。

仮想アドレス空間のブロックのサイズの大小が影響して、ヒープの断片化が問題になる。
断片化により、実際にコミットできるのは仮想アドレス空間の半分程度になることもある。

※ 断片化は 32bit プロセス(ユーザ空間 2GB)で特に問題になりやすい。
64bit 化すればアドレス空間が広がるため、断片化に起因する OutOfMemory は起きにくくなる。

メモリ・リーク以外でのメモリ不足

システム上の問題。

トリミングが間に合わない

利用率80%を超えてから開始されるページ プールと非ページ プールの
トリミングが、大量の一時オブジェクトの作成に間に合わない事がある。

ディスクへの書き込みが間に合わない

  • 遅延書き込みキャッシュが影響してメモリ不足が発生することがある。
  • 大きなファイル(数百MB以上)をコピーする場合、
    全体的なシステム パフォーマンスの低下が発生する可能性がある。

irpstacksize拡張の判断基準

  • IO要求は IRP と IRPスタック というデータ構造で受け渡される。
  • IRPスタックのサイズが不足してデバイスが使用できなくなることがある。
  • ウイルス対策ソフトウェアが原因でイベント ID 2011 が発生することがある。

カーネル メモリ スペース縮小の影響

  • 32bit OS にて 3GB スイッチを適用することで、カーネル メモリ スペースが 2GB から 1GB に縮小される影響。
  • また、32bit OS に多くの物理メモリを搭載すると、
    物理メモリと仮想メモリのマップ情報を管理するカーネル メモリ スペース(PTE)が圧迫される。

※ いずれも 32bit OS 固有の制約。64bit OS では該当しない。

Large Pageの影響

Large Page の確保のトリミングが完了するまでシステムが応答しなくなる。

※ Large Page は連続した物理メモリを要求するため、
断片化した状態では確保に時間がかかる(SQL Server の Lock Pages in Memory 等で問題になりうる)。

ESENTキャッシュの影響(ドメインコントローラ)

ESENT キャッシュが lsass.exe のメモリリークの原因となっている事がある。

※ ESENT は AD のデータベース エンジン(LDAPの項も参照)。
DC で lsass.exe のワーキング セットが大きいこと自体は正常なキャッシュ動作のこともあり、
「増え続けて解放されない」かどうかで判断する。

調査の進め方

  1. リークしているのがどの領域かを切り分ける。
    • プロセスのプライベート バイト(ユーザモード)→ アプリのリーク
    • ページ/非ページ プール(カーネル)→ ドライバのリーク
    • ハンドル数 → ハンドル リーク
    • パフォーマンス カウンタで継続的に採取するのが基本。
  2. マネージドか、アンマネージドかを判定する(.NETのメモリ・リーク)。
  3. ハング・ダンプ時間をおいて複数回取得し、増えているオブジェクトを比較する。

参考

メモリ・リーク

ツール

メモリ管理


Tags: Windows, メモリ管理, 障害対応, 性能, デバッグ

NetDevInfraWiki

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

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally