gpt4 book ai didi

c# - Process.Start 因为 "Insufficient system resources exist"而失败是什么意思

转载 作者:行者123 更新时间:2023-11-30 14:15:34 24 4
gpt4 key购买 nike

我有一个 C# 应用程序,它使用 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 端看起来非常合理,但不知何故我的原始句柄数已经爆炸 waaaaay 失控。有什么想法会导致这样的句柄泄漏吗?我最初确信它是 Process.Start() 但那将是 USER 句柄,不是吗?

编辑:

这是我如何创建流程的示例:

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();
}
}

最佳答案

这里的问题是保留的进程句柄。从您后来的编辑中我们可以看出,您保留了对 Process.Start() 返回的 Process 对象的引用。如 documentation 中所述过程:

Like many Windows resources, a process is also identified by its handle, which might not be unique on the computer. A handle is the generic term for an identifier of a resource. The operating system persists the process handle, which is accessed through the Handle property of the Process component, even when the process has exited. Thus, you can get the process's administrative information, such as the ExitCode (usually either zero for success or a nonzero error code) and the ExitTime. Handles are an extremely valuable resource, so leaking handles is more virulent than leaking memory.

我特别喜欢使用“有毒”这个词。您需要处理并释放对 Process 的引用。

另请查看这个出色的问题及其相应的答案:Not enough memory or not enough handles?

关于c# - Process.Start 因为 "Insufficient system resources exist"而失败是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9828021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com