2017-12-31 54 views
1

Ich dachte, wie die MemoryCache-Klasse funktionierte, war es gehalten, was Sie in den Speicher gelegt, solange die CachePolicy noch erfüllt wurde, und solange die Speicherbedingungen zulassen.Warum gibt MemoryCache keine Elemente frei, wenn der Arbeitsspeicher niedrig ist?

Nach einigen Tests bin ich mir nicht sicher, ob MemoryCache etwas unternimmt, wenn die Speicherbedingungen niedrig sind.

kann ich den folgenden Code in einer Konsolenanwendung ausgeführt:

 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); 
     } 

Nach etwa 30 K Iterationen ich eine System.OutOfMemoryException bekommen.

Warum geben MemoryCache und der GC die gespeicherten Objekte bei niedrigen Speicherbedingungen nicht frei?

Antwort

1

Sie sollten einen Blick auf die CacheMemoryLimitMegabytes Eigenschaft oder die PhysicalMemoryLimitPercentage Eigenschaft werfen.

In früheren Versionen des MemoryCache wurden jedoch Probleme mit der Überprüfung des Speicherdrucks gemeldet. Werfen Sie einen Blick auf this question

+0

Ich habe einen Rückruf auf Cache löschen und das war informiert. Wenn eine nicht behandelte OutOfMemoryException ausgelöst wird, beginnt MemoryCache, Elemente zu löschen. Natürlich ist es dann zu spät. Wenn Sie einen try catch-Block hinzufügen, um die outofMemoryException zu verarbeiten, löscht MemoryCache keine Elemente mehr. – Aheho

+1

Es ist wie Quanten-Teilchen-Physik, wo Beobachtung das Verhalten ändert. – Aheho

Verwandte Themen