Process.Start()
启动另一个可执行文件。99%的情况下,这个调用都能正常工作。然而,当应用程序运行了相当长的时间后,
Process.Start()
会失败,并显示错误消息:Insufficient system resources exist to complete the requested service
最初,我认为这可能是由于程序中存在内存泄漏 - 我已经对其进行了相当广泛的分析,但似乎没有泄漏 - 即使在此消息失败时,内存占用仍然是合理的。
在此类故障之后,如果我打印一些系统统计信息,似乎有超过600MB的可用RAM,磁盘上有足够的空间,并且CPU使用率实际上为0%。
是否还有其他我没有考虑到的系统资源?我是否遇到了.NET VM内的内存限制?
编辑2:
我在SysInternals Process Explorer中打开了应用程序,看起来我正在不断地泄漏句柄:
Handles Used: 11,950,352 (!)
GDI Handles: 26
USER Handles: 22
这里奇怪的是Win32句柄方面似乎很合理,但是我的原始句柄计数已经失控了。有什么想法可以导致这样的句柄泄漏吗?我最初认为是Process.Start(),但那应该是用户句柄,不是吗?
编辑:
这是我创建进程的一个示例:
var pInfo = new ProcessStartInfo(path, ClientStartArguments)
{
UseShellExecute = false,
WorkingDirectory = workingDirectory
};
ClientProcess = Process.Start(pInfo);
这是一个例子,展示了我如何在程序中与进程进行交互后杀死同一进程的方法:
Process[] clientProcesses = Process.GetProcessesByName(ClientProcessName);
if (clientProcesses.Length > 0)
{
foreach (var clientProcess in clientProcesses.Where(
clientProcess => clientProcess.HasExited == false))
{
clientProcess.Kill();
}
}