2017-01-31 3 views
4

Quand l'expulsion MemoryCache de dot net se produit-elle? Comment puis-je simuler l'expulsion dans l'application console? Chaque fois que j'essaie d'ajouter des objets dans le cache mémoire jusqu'à l'expulsion, j'obtiens OutofMemoryException à la place.Dot Net MemoryCache Eviction

+0

Copie possible de [MemoryCache n'obéit pas aux limites de mémoire dans la configuration] (http://stackoverflow.com/questions/6895956/memorycache-does-not-obey-memory-limits-in- configuration) –

Répondre

2

Voir MemoryCacheElement, ce qui contrôle le comportement par défaut si vous ne transmettez pas de valeurs au NameValueCollection configin the constructor ou utilisez l'instance par défaut. En regardant à travers les valeurs par défaut du MemoryCacheElement, il vérifie toutes les deux minutes (mais il va plus vite the closer you are to the high pressure limit). Une fois à l'intérieur du timer's callback, il calcule le pourcentage à découper du MemoryCache, puis appelle le MemoryCache.Trim(Int32) en utilisant le pourcentage calculé.

Une chose à noter dans the percentage calculation, si aucune garbage gar 2. Gen 2 n'est passé, le cache ne tente pas de se réduire lui-même.

Il est très possible que le programme de votre console de test ait utilisé toute la mémoire avant qu'une collection Gen 2 puisse se produire ou soit encore dans le mode lent initial de deux minutes pour vérifier la pression de la mémoire articles sortis.

Si vous souhaitez simuler une expulsion simplement appeler

MemoryCache.Default.Trim(50); 

Et cela de la moitié expulser cache à partir du cache par défaut.