我有一个程序,该程序会定期启动具有Process.Start()
功能的另一个进程。
几个小时后,我可以使用Windows资源监视器检测到内存泄漏。 我可以看到在
上键入"Key"
的大量Handles。
“ \ REGISTRY \ MACHINE \ SOFTWARE \ Classes.exe”
“ \ REGISTRY \ MACHINE \ SOFTWARE \ Classes \ exefile”
“ \ REGISTRY \ MACHINE \ SOFTWARE \ Classes \ exefile \ shell \ open”
这是我的代码: 我的代码很简单:
Process streamerProcess = new Process();
streamerProcess.StartInfo.FileName = SEStreamRequester.StreamerPath;
streamerProcess.StartInfo.Arguments = parameters;
try {
streamerProcess.Start();
m_streamerPid = streamerProcess.Id;
}
catch(Exception e) {
m_streamerPid = 0;
throw new System.ComponentModel.Win32Exception(
string.Format("Error while start streamer:{0}", e.Message)
, e
);
}
finally {
streamerProcess.Dispose();
}
其中parameters
和SEStreamRequester.StreamerPath
是字符串
如果我正确地处置了所有Process实例,我便在代码中进行搜索,我认为是这样。您如何确认这些Handle被Process实例使用? 我如何找到泄漏的来源?
谢谢。
答案 0 :(得分:0)
我将尝试根据您给出的上下文来制定答案。如果您在处理完成后不处理该对象,则该对象将保持活动状态。
我建议您使用“使用”来初始化进程。块完成后,“使用”将为您处理。
using (Process process = new Process("Cmd.exe", commandString))
{
process.Start();
}
只要您确实处置了对象。垃圾收集器应该做剩下的!也许请查看以下文档:https://docs.microsoft.com/en-us/dotnet/api/system.idisposable.dispose?view=netframework-4.7.2
这是有关垃圾回收的更多信息:https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/