アプリケーションでメモリ リークを発見しました。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 の動作は明らかに正しくないため、迅速な修正が必要だと思います。
それが何を意味するのかよくわかりませんが、誰かがこの問題を解決する方法を知っていますか?
ありがとうございました