1

アプリケーションでメモリ リークを発見しました。Process.GetProcesses を呼び出すたびに、アプリケーションのメモリ使用量が増加し、アプリケーションがシャットダウンされるまで解放されません。約 10 秒ごとにこれを呼び出す必要があるため、アプリケーションがメモリ不足でクラッシュするまでの数時間しか実行できません。私はこのサイトでこの記事を見つけましたが、これまでに多くの解決策が得られたようには見えません. Process.GetProcessesByName(String, String) メモリ リーク

これが私のコードです:

Public Shared Function GetProcessInfo() As List(Of ClientResources_OBJECT.ProcessInfo)

        Try


            Dim ProcessInfoList As New List(Of ClientResources_OBJECT.ProcessInfo)

            For Each Proc As Process In Process.GetProcesses

                Dim PI As New ClientResources_OBJECT.ProcessInfo
                With PI
                    .Name = Proc.ProcessName
                    .PID = Proc.Id
                    .Responding = Proc.Responding
                End With
                ProcessInfoList.Add(PI)

                'cleanup resources
                Proc.Dispose()
                Proc = Nothing
                PI = Nothing

            Next

            PerformanceCounter.CloseSharedResources()
            GC.Collect()

            Return ProcessInfoList

        Catch ex As Exception
            Dim st As New StackTrace(True)
            st = New StackTrace(ex, True)
            Console.WriteLine(Err.Description, Err.Number,       System.Reflection.MethodInfo.GetCurrentMethod.Name, st.GetFrame(0).GetFileLineNumber().ToString)
        End Try

        Return Nothing

    End Function

誰かが他の質問で次のように述べました:

警告: これは非常に汚いクイックフィックスですが、リフレクションを使用してそれらを無効にしてください。

プライベート変数へのアクセス: リフレクションを使用して C# のプライベート読み取り専用フィールドを変更できますか?

静的クラスの使用例: リフレクションを使用して、オブジェクトの初期化前に静的変数値を設定しますか? (C#)

typeof(Process).GetFields(BindingFlags.Static | BindingFlags.NonPublic) のバリエーションを使用して、フィールドなどを見つけることができます。

Process の動作は明らかに正しくないため、迅速な修正が必要だと思います。

それが何を意味するのかよくわかりませんが、誰かがこの問題を解決する方法を知っていますか?

ありがとうございました

4

0 に答える 0