一个进程可能会在被杀死后导致内存泄漏?

时间:2012-05-02 21:34:24

标签: c# .net wpf windows google-chrome

我正在编写一个可以生成并杀死Chrome浏览器的应用程序。虽然我以编程方式杀死进程(与通过Windows任务管理器执行查杀操作相同),但有人建议这也可能导致内存泄漏 - 即内核资源等元素与原始进程没有正确关联

在进程被杀死后,应用程序是否有可能泄漏内存或者有无法恢复的内存?

4 个答案:

答案 0 :(得分:2)

这个可能发生,但是当它发生时,永远不会程序中的错误。它总是由Windows内核代码或某些内核驱动程序中的错误/错误引起。此外,您甚至不太可能在标准的Windows安装上遇到此类行为。

答案 1 :(得分:1)

程序可能会启动多个进程。杀死父进程本身并不能保证子进程终止。这看起来像是内存泄漏。就操作系统而言,所有分配的内存仍然与正在运行的进程相关联,只是您可能不希望所有这些进程仍在运行。

就Chrome而言,它确实产生了许多子进程。我认为确保他们在父进程意外终止时自行清理,但我无法确定。

答案 2 :(得分:1)

直接在任务管理器中终止进程可能会导致内存泄漏。 有证据表明,杀死“explorer.exe”会降低整个操作系统的速度。

每个Chrome窗口都有一个GUI进程和每个活动选项卡的后台进程。后台进程可用于获取页面内容,发送请求/发布数据以及保存比GUI进程更少的内核对象句柄。 任何编程框架都至少有两种方法来关闭活动进程。例如,在.NET中,Process类有以下两种方法:

  1. CloseMainWindow()
    • 向主窗口消息循环发送WM_QUIT消息以请求关闭该进程。这使程序有机会重新调用其子窗口及其内核对象。
  2. 杀死()
    • 强制终止进程,就像在任务管理器中终止进程一样。这是关闭后台进程的唯一方法。但是当这适用于GUI进程时,这不会触发所有GUI /内核事件来释放资源。内核对象包括GDI对象,文件/打印机句柄,数据库/网络连接上下文等。 释放这些资源需要一些时间,同时跟踪整个内存链表/映射以释放内核对象的资源。 即便是.NET / java也有它的垃圾收集器来释放“托管”内存,内核对象的非托管资源并不总是被覆盖。
  3. 以下是.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)

如果程序在剪贴板上放置了大量内存,它可能看起来像内存泄漏一样,但剪贴板仍然负责内存并在其他东西复制新内容时释放它

这是我唯一可以想到的记忆超过程序生命周期的情况。