2017-01-31 5 views
4

Когда происходит выселение MemoryCache в точке net? Как я могу имитировать выселение в консольном приложении? Всякий раз, когда я пытаюсь добавить объекты в кэш памяти до тех пор, пока не произойдет выселение, я вместо этого получаю OutofMemoryException.Dot Net MemoryCache Eviction

+0

Возможный дубликат [MemoryCache не соответствует ограничениям памяти в конфигурации] (http://stackoverflow.com/questions/6895956/memorycache-does-not-obey-memory-limits-in-configuration) –

ответ

2

См. MemoryCacheElement. Это то, что контролирует поведение по умолчанию, если вы не передаете значения в NameValueCollection configin the constructor или используете экземпляр по умолчанию.

Просматривая значения по умолчанию MemoryCacheElement, он проверяет каждые две минуты (однако он идет быстрее the closer you are to the high pressure limit). Как только внутри timer's callback он будет окупить процент, чтобы обрезать MemoryCache, а затем вызывается MemoryCache.Trim(Int32) с использованием рассчитанного процента.

Одна вещь, которую следует отметить в the percentage calculation, если нет коллекций мусора Gen 2, кэш не пытается сжиматься.

Очень возможно, что при запуске программы вашей тестовой консоли она использовала всю память до того, как коллекция Gen 2 могла произойти или все еще находилась в начальном двухминутном медленном режиме, чтобы проверить давление памяти, прежде чем она сможет очистить предметы из.

Если вы хотите, чтобы имитировать выселение просто позвоните

MemoryCache.Default.Trim(50); 

И что будет выселить половину кэша из кэша по умолчанию.