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?
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
Es ist wie Quanten-Teilchen-Physik, wo Beobachtung das Verhalten ändert. – Aheho