1年後にこれを見直したところ、キャッシュがランダムに「ドロップ」するという元の投稿で、さらに詳しい情報が見つかりました。MSDN には、構成可能なキャッシュ プロパティCacheMemoryLimitMegabytes
とについて次のように記載されていますPhysicalMemoryLimitPercentage
。
デフォルト値は 0 です。これは、MemoryCache クラスのオートサイズ ヒューリスティックがデフォルトで使用されることを意味します。
CacheMemoryMonitor.cs
いくつかの逆コンパイルと調査を行うと、メモリのしきい値を定義するクラスの奥深くに事前定義されたシナリオがあります。AutoPrivateBytesLimit
プロパティのそのクラスのコメントのサンプルを次に示します。
// Auto-generate the private bytes limit:
// - On 64bit, the auto value is MIN(60% physical_ram, 1 TB)
// - On x86, for 2GB, the auto value is MIN(60% physical_ram, 800 MB)
// - On x86, for 3GB, the auto value is MIN(60% physical_ram, 1800 MB)
//
// - If it's not a hosted environment (e.g. console app), the 60% in the above
// formulas will become 100% because in un-hosted environment we don't launch
// other processes such as compiler, etc.
特定の値が重要であるとは限りませんが、キャッシュが頻繁に使用される理由を理解するのと同じくらい重要です:何度も取得したくない大きなオブジェクトを格納するためです。これらの大きなオブジェクトがキャッシュに格納されていて、これらの内部計算に基づくホスティング環境のメモリしきい値を超えた場合、項目がキャッシュから自動的に削除されることがあります。IISで複数のアプリを実行しているおそらく2GBのメモリを使用して、ホストされたサーバーのメモリに非常に大きなコレクションを保存していたため、これは確かに私のOPを説明できます。
これらの値の設定には、明示的なオーバーライドがあります。構成を介して (またはMemoryCache
インスタンスのセットアップ時に)CacheMemoryLimitMegabytes
およびのPhysicalMemoryLimitPercentage
値を設定できます。を 95 (%)に設定した次のMSDNリンクから変更されたサンプルを次に示します。physicalMemoryPercentage
<configuration>
<system.runtime.caching>
<memoryCache>
<namedCaches>
<add name="default"
physicalMemoryLimitPercentage="95" />
</namedCaches>
</memoryCache>
</system.runtime.caching>
</configuration>