我正在编写一个可以生成并杀死Chrome浏览器的应用程序。虽然我以编程方式杀死进程(与通过Windows任务管理器执行查杀操作相同),但有人建议这也可能导致内存泄漏 - 即内核资源等元素与原始进程没有正确关联
在进程被杀死后,应用程序是否有可能泄漏内存或者有无法恢复的内存?
答案 0 :(得分:2)
这个可能发生,但是当它发生时,永远不会程序中的错误。它总是由Windows内核代码或某些内核驱动程序中的错误/错误引起。此外,您甚至不太可能在标准的Windows安装上遇到此类行为。
答案 1 :(得分:1)
程序可能会启动多个进程。杀死父进程本身并不能保证子进程终止。这看起来像是内存泄漏。就操作系统而言,所有分配的内存仍然与正在运行的进程相关联,只是您可能不希望所有这些进程仍在运行。
就Chrome而言,它确实产生了许多子进程。我认为确保他们在父进程意外终止时自行清理,但我无法确定。
答案 2 :(得分:1)
直接在任务管理器中终止进程可能会导致内存泄漏。 有证据表明,杀死“explorer.exe”会降低整个操作系统的速度。
每个Chrome窗口都有一个GUI进程和每个活动选项卡的后台进程。后台进程可用于获取页面内容,发送请求/发布数据以及保存比GUI进程更少的内核对象句柄。 任何编程框架都至少有两种方法来关闭活动进程。例如,在.NET中,Process类有以下两种方法:
以下是.NET C#中的测试应用程序。我们可以使用Visual Studio附加组件将CloseMainWindow()与Kill()进行比较:Memory Profiler。在几乎所有情况下,通过检查实时内存图中的“根引用”和“实例引用”,Kill()更快但释放的内存更少。
private Process _chromeProcess = new Process();
private void bntCreate_Click(object sender, EventArgs e)
{
string chromePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
@"Google\Chrome\Application\chrome.exe");
_chromeProcess.StartInfo = new ProcessStartInfo(chromePath, @"-app=http://localhost:(a local Web site)");
_chromeProcess.Start();
}
private void btnKill_Click(object sender, EventArgs e)
{
_chromeProcess.Kill();
_chromeProcess.WaitForExit();
_chromeProcess.Close();
}
private void btnClose_Click(object sender, EventArgs e)
{
_chromeProcess.CloseMainWindow();
_chromeProcess.WaitForExit();
_chromeProcess.Close();
}
答案 3 :(得分:0)
如果程序在剪贴板上放置了大量内存,它可能看起来像内存泄漏一样,但剪贴板仍然负责内存并在其他东西复制新内容时释放它
这是我唯一可以想到的记忆超过程序生命周期的情况。