1. ホーム
  2. c#

[解決済み] .NETのガベージコレクションを短時間で防止する方法

2023-07-17 09:46:27

質問

非常に大量のデータを処理する高性能のアプリケーションがあります。 非常に短時間に膨大な量の情報を受信、分析、破棄しています。 これは、現在最適化しようとしているかなりの量のオブジェクト チャーンを引き起こしますが、2 つ目の問題も引き起こします。 ガベージコレクションが起動すると、その処理に長い遅延が発生します(長いというのは、10秒から100秒のことです)。 99%の時間は許容範囲ですが、1~2分程度の短い時間では、ガベージコレクションが遅延を引き起こさないことを絶対に確認する必要があります。 このような時間がいつ発生するかは事前に分かっているので、この間にガーベジコレクションが発生しないようにする方法が必要です。 アプリケーションは .NET 4.0 フレームワークを使用して C# で書かれており、重要であれば、マネージド コードとアンマネージド コードの両方を使用します。

私の質問は次のとおりです。

  1. プログラム全体のガーベッジ コレクションを一時停止することは可能ですか。
  2. System.GC.Collect() を使用して、ガベージコレクションから解放される必要があるウィンドウの前に強制的にガベージコレクションを行うことは可能ですか、また、行った場合、どのくらいの期間ガベージコレクションから解放されますか?
  3. 全体的なガベージ コレクションの必要性を最小限に抑えるために、どのようなアドバイスがありますか。

注意 - このシステムは、多くの異なるコンポーネントを持つかなり複雑なものです。 私は、プログラムのすべてのクラスでカスタム IDisposable インターフェイスを実装しなければならないようなアプローチを取ることを避けたいと考えています。

どのように解決するのですか?

.NET 4.6では、2つの新しいメソッドが追加されました。 GC.TryStartNoGCRegion GC.EndNoGCRegion だけで、このように