检查和清除 .NET MemoryCache。 RAM不断增加
Posted
技术标签:
【中文标题】检查和清除 .NET MemoryCache。 RAM不断增加【英文标题】:Inspecting and clearing .NET MemoryCache. RAM keeps building up 【发布时间】: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-principlesRuntime.Caching.MemoryCache.Default.Trim(100)
你真的在使用默认缓存吗?
您能展示一下如何在缓存中添加一个典型的大集合条目吗?
我用示例编辑了原始帖子。我确实在使用默认缓存。这是不好的做法吗?如果是这样,为什么?
您是否尝试过添加CacheItemPolicy 以自动使缓存项过期?
【参考方案1】:
只需创建一个名为 clsMemory 的类并编写以下代码:
Imports System.Runtime.InteropServices
Public Class clsMemory
<DllImport("KERNEL32.DLL", EntryPoint:="SetProcessWorkingSetSize", SetLastError:=True, CallingConvention:=CallingConvention.StdCall)> _
Friend Shared Function SetProcessWorkingSetSize(ByVal pProcess As IntPtr, ByVal dwMinimumWorkingSetSize As Integer, ByVal dwMaximumWorkingSetSize As Integer) As Boolean
End Function
<DllImport("KERNEL32.DLL", EntryPoint:="GetCurrentProcess", SetLastError:=True, CallingConvention:=CallingConvention.StdCall)> _
Friend Shared Function GetCurrentProcess() As IntPtr
End Function
Public Sub New()
Dim pHandle As IntPtr = GetCurrentProcess()
SetProcessWorkingSetSize(pHandle, -1, -1)
End Sub
End Class
然后在一些表单窗口中添加一个按钮并写下这个:
Dim MemClass As New clsMemory()
MemClass = Nothing
也许它对你有用,因为它对我有用很多年。
【讨论】:
以上是关于检查和清除 .NET MemoryCache。 RAM不断增加的主要内容,如果未能解决你的问题,请参考以下文章
如何清除 System.Runtime.Caching.MemoryCache
如何清除System.Runtime.Caching.MemoryCache