【发布时间】:2021-12-23 23:55:46
【问题描述】:
我们使用 .NET 内存缓存来存储大量数据。我们有时需要清除缓存,我们使用Runtime.Caching.MemoryCache.Default.Remove("keyhere")
为了那个原因。不幸的是,我看到 w3wp.exe 使用的 RAM 量几乎没有下降,在它回收整个池之前,它在一天内累积到大约 64GB,每个人都失去了他们的 session_ID,不得不再次登录到我们的应用程序。
我试过跑步
System.Threading.Thread.Sleep(200)
GC.Collect()
GC.WaitForPendingFinalizers()
但这似乎没有效果。
清除整个缓存
Runtime.Caching.MemoryCache.Default.Trim(100)
也几乎没有任何区别。
我觉得很多集合只是保留在 RAM 中,没有被任何缓存条目/键实际使用或引用。
如何确保没有内存泄漏或集合被多次存储?或者有没有办法找出 memorycache/w3wp.exe RAM 在某个时候填充了哪些集合(带有键和大小)?
我现在很迷茫。
编辑:我当前如何将集合添加到缓存(VB.NET)的示例:
Private m_Companies_All As Core._CompanyCollection
//<summary>Gets all Active Companies that are available within the current CustomerConfig</summary>
Public Property Companies_All As Core._CompanyCollection Implements ICustomerConfig.Companies_All
Get
Dim xCacheKey As String = Me.CacheKey("Core.Companies_All")
Dim xCacheItem As Runtime.Caching.CacheItem = Runtime.Caching.MemoryCache.Default.GetCacheItem(xCacheKey)
If xCacheItem Is Nothing Then
m_Companies_All = Core._CompanyCollection.All(Core._Company.eStates.Active, Me)
xCacheItem = New Runtime.Caching.CacheItem(xCacheKey, m_Companies_All) // Add CacheItem to the Cache for 20m
Dim xCachePolicy As New Runtime.Caching.CacheItemPolicy With {.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(20)}
//Insert into Cache
Runtime.Caching.MemoryCache.Default.Add(xCacheItem, xCachePolicy)
End If
//xItem Is Not Nothing
m_Companies_All = xCacheItem.Value
Return m_Companies_All
End Get
Set(value As Core._CompanyCollection)
m_Companies_All = value
End Set
End Property
【问题讨论】:
-
您是否分析过内存使用情况? michaelscodingspot.com/memory-profilers-principles
-
Runtime.Caching.MemoryCache.Default.Trim(100)你真的在使用默认缓存吗? -
您能展示一下如何在缓存中添加一个典型的大集合条目吗?
-
我用示例编辑了原始帖子。我确实在使用默认缓存。这是不好的做法吗?如果是这样,为什么?
-
您是否尝试过添加CacheItemPolicy 以自动使缓存项过期?
标签: c# .net vb.net memorycache