VB.NET-使用while true循环、线程和wmi的内存泄漏

VB.NET-使用while true循环、线程和wmi的内存泄漏,vb.net,multithreading,memory-leaks,wmi,Vb.net,Multithreading,Memory Leaks,Wmi,此代码开始使用40 MB RAM,2小时后变为120 MB RAM。我试着换几行,但用过的内存仍然在不断增加。我做错了什么?是while循环吗?剧院在吗?是ContextDB.SaveChanges()吗 更新1:显然,问题是通过在线程上使用“IsBackground=True”并处理每个“m”对象解决的。使用的RAM在48MB内是稳定的。谢谢各位 Dim Work As New Thread(AddressOf MonitorServer) Work.IsBackground = True '

此代码开始使用40 MB RAM,2小时后变为120 MB RAM。我试着换几行,但用过的内存仍然在不断增加。我做错了什么?是while循环吗?剧院在吗?是ContextDB.SaveChanges()吗

更新1:显然,问题是通过在线程上使用“IsBackground=True”并处理每个“m”对象解决的。使用的RAM在48MB内是稳定的。谢谢各位

Dim Work As New Thread(AddressOf MonitorServer)
Work.IsBackground = True 'Added this line
Work.Start(Server.ServerID)

Using searcher As New ManagementObjectSearcher(Scope, New ObjectQuery("SELECT * FROM Win32_OperatingSystem"))
    Using queryCollection = searcher.Get()
        For Each m In queryCollection
            Server.Host = m("csname")
            Server.OS = m("Caption")
            m.Dispose() 'Added this line
            m = Nothing 'Added this line
        Next
    End Using
End Using

更新2:问题仍然存在,24小时后,代码使用了350 MB

原始代码:

Full code: http://200.98.144.175/monitor.txt

Private Shared ServerList As New List(Of Server)

Private Shared Sub StartMonitor()

Using ContextDB As New EnvironmentMonitorEntities

    While True

        Dim Servers = (From A In ContextDB.Server).ToList

        For Each Server In Servers

            If Not ServerList.ToList.Contains(Server) Then

                ServerList.Add(Server)

                Dim Work As New Thread(AddressOf MonitorServer)
                Work.Start(Server) 'Start a thread for each server

            End If

        Next

        GC.Collect() 'Force CG
        Thread.Sleep(CInt(TimeSpan.FromSeconds(10).TotalMilliseconds)) 'Check new servers each 10 seconds

    End While

End Using

End Sub

Private Shared Sub MonitorServer(p As Object)

Dim Server = CType(p, Server)

Using ContextDB As New EnvironmentMonitorEntities

    While True

        Dim ServerID = Server.ServerID
        Dim ServerStatus = (From A In ContextDB.ServerStatus Where A.ServerID = ServerID).First
        Dim Scope As New ManagementScope("\\" + Server.IP + "\root\CIMV2")

        ServerStatus.LastUpdate = Now
        ContextDB.SaveChanges()

        Scope.Connect() 'Connect on server

        Alerts.SetServerStatus(ServerStatus, AlertType.Online)
        ContextDB.SaveChanges()

        Using searcher As New ManagementObjectSearcher(Scope, New ObjectQuery("SELECT * FROM Win32_OperatingSystem"))
            Using queryCollection = searcher.Get()
                For Each m In queryCollection
                    Server.Host = m("csname")
                    Server.OS = m("Caption")
                Next
            End Using
        End Using

        ContextDB.SaveChanges()

        Using searcher As New ManagementObjectSearcher(Scope, New ObjectQuery("SELECT * FROM Win32_Processor"))
            Using queryCollection = searcher.Get()
                For Each m In queryCollection
                    Server.Processor = m("Name")
                    Server.Architecture = m("Architecture")
                Next
            End Using
        End Using

        ContextDB.SaveChanges()

        Using searcher As New ManagementObjectSearcher(Scope, New ObjectQuery("SELECT * FROM Win32_OperatingSystem"))
            Using queryCollection = searcher.Get()
                For Each m In queryCollection
                    ServerStatus.RAMUsage = m("FreePhysicalMemory")
                    ContextDB.SaveChanges()
                Next
            End Using
        End Using

        GC.Collect()
        Thread.Sleep(CInt(TimeSpan.FromSeconds(3).TotalMilliseconds)) 'Monitor server each 3 seconds

    End While

End Using 'ContextDB

End Sub

哇,只要你写了一行
GC.Collect()
,就应该表明这可能不是解决这个问题的最佳方法。你调查过了吗?我认为这更适合你所做的事情,但只有你才能成为裁判。祝你好运。

谢谢@Karl,我将尝试删除GC.Collect()并将结果发布到这里。不幸的是,客户端想要使用WMI…同样的问题@Karl。。用过的记忆会随着时间的推移而不断增加。不,你没有领会我的意思。我并不是说删除
GC.Collect()
调用将有助于解决内存问题,而是说您的方法不太理想。PowerShell支持WMI功能,而垃圾收集器通常在很大程度上都是大型复杂的黑匣子。内存缓慢上升可能是/可能不是问题。根据我的经验,如果您运行的是32位,那么在遇到问题之前,您至少有1500 MB左右的内存。作为一个测试,把你的睡眠时间减少到0,让它疯狂地运行一段时间,看看你的记忆是否在某一点上持续上升或趋于平稳。