2017-01-31 90 views
4

dot net的MemoryCache驅逐何時發生?我如何模擬控制檯應用程序中的驅逐?每當我嘗試將對象添加到內存緩存直到發生驅逐出現,我都會得到OutofMemoryException。Dot Net MemoryCache驅逐

+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垃圾收集發生,緩存不會嘗試收縮自身。

測試控制檯程序運行的方式很有可能會在第2代收集可能發生之前耗盡所有內存,或者仍然處於最初的兩分鐘慢速模式,以便在它可以清除之前檢查內存壓力項目了。

如果您想模擬驅逐就叫

MemoryCache.Default.Trim(50); 

這就會收回一半的緩存從默認的緩存。