Share via


ガベージ コレクション

更新 : 2007 年 11 月

.NET Framework のガベージ コレクタは、アプリケーションのメモリの割り当ておよび解放を管理します。new 演算子を使ってオブジェクトを生成するたびに、共通言語ランタイムは、マネージ ヒープからオブジェクトにメモリを割り当てます。マネージ ヒープに使用可能なアドレス空間がある限り、ランタイムは新しいオブジェクト用に領域の割り当てを続けます。しかし、メモリの大きさは無限ではありません。最終的には、ガベージ コレクタが、一部のメモリを解放するためにガベージ コレクションを実行する必要があります。コレクションの実行に最適な時期は、ガベージ コレクタの最適化エンジンが、割り当てられるオブジェクトの状況に応じて決定します。コレクションを実行する場合、ガベージ コレクタは、アプリケーションによって使用されなくなったオブジェクトがマネージ ヒープにあるかどうかをチェックし、使われていないオブジェクトのメモリを再利用するために必要な操作を実行します。

このセクションでは、ガベージ コレクタがアプリケーションのマネージ オブジェクトに対して、メモリの割り当てと解放を自動的に管理する方法を説明します。さらに、アプリケーションによって作られるアンマネージ リソースを適切にクリーンアップするための、推奨されるコードのデザイン モデルについても説明します。

メモ :

.NET Framework Version 1.0 の共通言語ランタイム (CLR: Common Language Runtime) は、大きいオブジェクト ヒープ用に独立したメモリ マネージャを備えています。場合によっては、このメモリ マネージャは、使用されていないメモリをオペレーティング システムに返さず、ガベージ コレクション用にメモリを解放しないことがありました。その結果、仮想アドレス空間の断片化のためにメモリの割り当てが失敗していました。.NET Framework Version 1.1 および 2.0 では、大きいオブジェクト ヒープは "ヒープ セグメント" と呼ばれる連続するメモリ領域で構成されます。ヒープ セグメントは、メモリの断片化を最小限に抑えることができるように適切に配置されています。ガベージ コレクション中には、大きいオブジェクトからクリアされた領域は統合されて、空きリストに配置されます。空きリストの項目だけを格納するヒープ セグメントは解放され、メモリがオペレーティング システムに返されます。大きいオブジェクト ヒープに対するこの変更により、仮想アドレス空間がこのように断片化されることで生じるメモリ割り当てエラーは効果的に除去されました。

重要 :

2 GB を超えるメモリを搭載するサーバーでは、使用できるメモリが存在するにもかかわらず、見かけ上のメモリ不足の問題が発生するのを回避するために、boot.ini ファイルに /3GB スイッチを指定しなければならないこともあります。

このセクションの内容

  • メモリ管理に関する開発知識
    これまで Visual Basic、C++、COM を使用してきた開発者が、マネージ コードに移行するときに必要とされる知識について説明します。

  • Finalize メソッドおよびデストラクタ
    Finalize メソッドとデストラクタを使用して、ガベージ コレクタが自動的にオブジェクトのメモリを再利用する前に、オブジェクトが必要なクリーンアップ操作を実行できるようにする方法を説明します。

  • 弱い参照
    アプリケーションからオブジェクトへのアクセスを許容したまま、そのオブジェクトをガベージ コレクタが収集できるようにする機能について説明します。

  • 発生したコレクション
    オブジェクトを直ちに再利用するか、または次回の最適なタイミングで再利用する方法について説明します。

  • 待機モード
    ガベージ コレクションの割り込みの動作を決定するモードについて説明します。

  • 共有 Web ホストの最適化
    複数の小規模な Web サイトをホストする形で共有されているサーバーで、ガベージ コレクションを最適化する方法について説明します。

  • ガベージ コレクションの通知
    フル ガベージ コレクションが近づいたときと完了したときを検出する方法について説明します。

  • アンマネージ リソースのクリーンアップ
    アンマネージ リソースをクリーンアップするために推奨されるコードのデザイン モデルについて説明します。

参照

  • System.GC
    システム ガベージ コレクタとやり取りする方法を提供します。

  • Object.Finalize
    ガベージ コレクタがオブジェクトを再利用する前に、オブジェクトがリソースを解放したり、その他のクリーンアップ操作を実行したりできるようにします。

  • System.IDisposable
    リソースのクラスに機能を提供します。

関連するセクション