ホームページ >バックエンド開発 >C#.Net チュートリアル >.Net ガベージ コレクション メカニズムの詳細な紹介

.Net ガベージ コレクション メカニズムの詳細な紹介

高洛峰
高洛峰オリジナル
2016-12-20 14:13:331774ブラウズ

デストラクター

デストラクターには public などの修飾子を含めることはできません。パラメータは受け付けられません。

コンパイラは、次のように、デストラクターを Object.Finalize メソッドのオーバーライド バージョンに自動的に変換します。

class Test
{
  protected override void Finalize()
  {
    try {…}
    finally { base.Finalize(); }
  }
}

ガベージ コレクター

.NET ガベージ コレクターは以下を保証します:

l すべてのオブジェクトは破棄され、そのデストラクターは確実に実行されます。プログラムが終了すると、すべてのオブジェクトが破棄されます。
l 各オブジェクトは一度だけ破壊されます。
l 各オブジェクトは、到達不能な場合 (つまり、オブジェクトへの参照がない場合) にのみ破棄されます。

仕組み:

1) 到達可能なすべてのオブジェクトを含むマップを構築します。これを行うために、オブジェクト内の参照フィールドを繰り返したどります。ガベージ コレクターはこのマップを非常に慎重に構築し、循環参照が無限に繰り返されないようにします。このマップ内のオブジェクトは到達不能とみなされません。
2) 到達不能なオブジェクトに実行する必要のあるデストラクターがあるかどうかをチェックします (デストラクターを実行するプロセスはファイナライズと呼ばれます)。ファイナライズが必要な到達不能なオブジェクトは特別なキューに入れられます。このキューは到達可能キューと呼ばれます。
3) 残りの到達不能オブジェクト (つまり、ファイナライズを必要としないオブジェクト) をリサイクルします。これを行うために、到達可能なオブジェクトをヒープ内で下に移動し、それによってヒープをデフラグし、ヒープの上部にあるメモリを解放します。ガベージ コレクターが到達可能なオブジェクトを移動すると、そのオブジェクトへの参照も更新されます。
4) その後、他のスレッドが実行を再開できるようにします。
5) 別のスレッドでのファイナライズが必要な、到達不能なオブジェクト (到達可能キュー内にある) に対してファイナライズ操作を実行します。

上記の概要からわかるように、デストラクターの存在により、上記のプロセスはさらに 2 つのステップ 2 と 5 を実行します。したがって、ジェネリックの代わりにブロックを使用することを検討してください。使用するクラスが Dispose メソッド (Close メソッド) を実装している場合。このメソッドは最後に呼び出すのが最善です (メソッドを呼び出す前に、破棄するオブジェクトの破棄属性が false であるかどうかを確認し、true でない場合にのみ破棄する必要があります。これが使用が推奨される理由でもあります)を使用すると、破棄される変数のスコープ (つまり、中括弧の間) を簡単に制限できます。または、using ブロックを使用して、このクラスを使用するコードを囲みます。 using ブロックに配置されるオブジェクトのタイプは、IDisposable インターフェイスを実装する必要があります。

標準クリーンアップ モード

最後に、.NET が推奨する標準クリーンアップ モード コードを示します。サンプル コード:

class MyClass : IDisposable
{
  private bool disposed = false;//Disposal 状态
 
  public void Dispose()//公有Dispose方法(可选实现IDisposal接口)
  {
    Dispose(true);
    GC.SuppressFinalize(this);
  }
 
  ~MyClass()
  {
    Dispose(false);
  }
 
  protected virtual void Dispose(bool disposing)
  {
    if (!disposed)
    {
      if (disposing)
      {
        //Dispose the managed resources.
      }
      //Dispose the unmanaged resources.
    }
    disposed = true;
  }
}

上記のコードでは、デストラクターから Dispose メソッドを呼び出します。これにより、Dispose が確実に実行されます。が実行されます。 , さらに、 GC.SuppressFinalize(this); は、コンパイラーがこのオブジェクトを破棄しないようにするために使用されます。

読んでいただきありがとうございます。皆さんのお役に立てれば幸いです。PHP 中国語 Web サイトへのサポートに感謝します。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。