2017-01-31 6 views
4

Wann tritt dot nets MemoryCache-Räumung auf? Wie kann ich die Räumung in der Konsolenanwendung simulieren? Immer wenn ich versuche, dem Speichercache Objekte hinzuzufügen, bis eine Räumung stattfindet, erhalte ich stattdessen OutofMemoryException.Dot Net MemoryCache Eviction

+0

Mögliches Duplikat von [MemoryCache beachtet nicht die Speichergrenzen in der Konfiguration] (http://stackoverflow.com/questions/6895956/memorycache-does-not-obey-memory-limits-in-configuration) –

Antwort

2

Siehe MemoryCacheElement, die das Standardverhalten steuert, wenn Sie keine Werte an die NameValueCollection configin the constructor übergeben oder die Standardinstanz verwenden.

Durch die Standardeinstellungen der MemoryCacheElement, überprüft es alle zwei Minuten (aber es geht schneller the closer you are to the high pressure limit). Einmal in der timer's callback wird es den Prozentsatz zum Abschneiden des MemoryCache und dann MemoryCache.Trim(Int32) mit dem berechneten Prozentsatz aufrufen.

Eine Sache zu beachten in the percentage calculation, wenn keine Gen 2 Garbage-Sammlungen passiert sind, versucht der Cache nicht, sich selbst zu schrumpfen.

Es ist sehr wahrscheinlich, dass die Art und Weise, wie das Testkonsolenprogramm lief, den gesamten Speicher verbrauchte, bevor eine Gen 2-Sammlung stattfinden konnte oder noch im ersten 2-Minuten-Langsam-Modus war, um den Speicherdruck zu überprüfen Artikel aus.

Wenn Sie rufen eine Räumung simulieren möchte nur

MemoryCache.Default.Trim(50); 

Und das wird die Hälfte des Cache aus dem Standardcache entfernt.