检查和清除 .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-principles Runtime.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

MemoryCache 如何清除全部缓存?

如何清除System.Runtime.Caching.MemoryCache

ASP.NET MVC 和 MemoryCache - 我如何使用它?

.Net Core缓存组件(MemoryCache)缓存篇

.net MemoryCache - 通知删除的项目