0

このコードは 40 MB の RAM を使用し始め、2 時間後には 120 MB の RAM になります。いくつかの行を変更しようとしましたが、使用されているメモリはまだ増え続けています。私は何を間違っていますか?whileループですか?テッズですか?ContextDB.SaveChanges() ですか?

UPDATE 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
4

1 に答える 1

1

GC.Collect()うわー、これがおそらくこの問題を解決するための最良の方法ではないという手がかりになるはずの行を書いたらすぐに。PowerShell を使用してサーバーの状態を調べましたか? これはあなたがしていることにより適していると思いますが、判断できるのはあなただけです。幸運を。

于 2013-07-02T17:57:34.280 に答える