2017-12-31 58 views
1

私はMemoryCacheクラスの仕組みは、CachePolicyがまだ満たされている限り、そしてメモリ条件が許す限り、あなたがそれをメモリに入れたものであると考えました。メモリが少ないときにMemoryCacheで項目を解放しないのはなぜですか?

いくつかのテストを実行した後、メモリ条件が低いときにMemoryCacheが何らかのアクションを実行するかどうかわかりません。私は、コンソールアプリケーションに次のコードを実行することができます

約30Kの反復後

 MemoryCache cache = MemoryCache.Default; 
     CacheItemPolicy p = new CacheItemPolicy() 
     { 
      AbsoluteExpiration = ObjectCache.InfiniteAbsoluteExpiration 
     }; 

     for (int i=0; i < 1000000; i++) 
     { 
      Console.WriteLine(i); 
      string s = new string('0', 50000); 
      cache.Add(new CacheItem(i.ToString(), s), p); 
     } 

、私はSystem.OutOfMemoryExceptionにを取得します。

MemoryCacheとGCがメモリ条件が低いときに格納されたオブジェクトを解放しないのはなぜですか?

答えて

1

CacheMemoryLimitMegabytesプロパティまたはPhysicalMemoryLimitPercentageプロパティを確認してください。

しかし、以前のバージョンのMemoryCacheでは、メモリの負荷をチェックする方法に問題が報告されています。 this question

+0

キャッシュの削除に関するコールバックを追加しました。これは通知していました。 未処理のOutOfMemoryExceptionがスローされると、MemoryCacheはアイテムの削除を開始します。もちろんそれまでにはそれは遅すぎる。 outofMemoryExceptionを処理するtry catchブロックを追加すると、MemoryCacheはアイテムを削除しなくなりました。 – Aheho

+1

観測が行動を変えるのは量子粒子物理学のようなものです。 – Aheho

関連する問題