Application.Exit()会清除内存吗?垃圾收集器在退出后或退出之前运行

时间:2013-08-14 16:03:30

标签: c# winforms garbage-collection

我有一个Windows应用程序,我在内存中加载了大量数据(我知道将大量数据加载到内存中不是一个好选择,但我没有选择)。 在某些情况下,我使用Application.Exit()方法退出了我的应用程序。

我对释放应用程序所占用的内存的过程感到困惑。即当我致电Application.Exit()时,会在内部拨打GC.Collect(),或者我自己先致电GC.Collect(),然后再Application.Exit()会更好吗?

Application.Exit()如何在内部运作? 我试图通过谷歌搜索找到答案,但没找到我要找的东西。

3 个答案:

答案 0 :(得分:3)

我认为您的主要问题是您将全局资源与流程资源混淆。垃圾收集器负责管理进程内的内存。它是一个进程资源,对系统中其他进程可用的内存没有影响。在退出之前GC是否运行对系统上的其他进程无意义

答案 1 :(得分:1)

使用像NET这样的框架的一个好处是不要担心这些细节 当然,您需要尝试尽可能降低内存使用率,但释放应用程序使用的MANAGED内存的工作量是保留给框架的工作,不会因为您的应用程序被终止而停止清理内存引用Application.Exit()

至于Application.Exit()的代码,很容易在互联网上找到

private static bool ExitInternal()
{
    bool flag = false;
    lock (internalSyncObject)
    {
        if (exiting)
        {
            return false;
        }
        exiting = true;
        try
        {
            if (forms != null)
            {
                foreach (Form form in OpenFormsInternal)
                {
                    if (form.RaiseFormClosingOnAppExit())
                    {
                        flag = true;
                        break;
                    }
                }
            }
            if (!flag)
            {
                if (forms != null)
                {
                    while (OpenFormsInternal.Count > 0)
                    {
                        OpenFormsInternal[0].RaiseFormClosedOnAppExit();
                    }
                }
                ThreadContext.ExitApplication();
            }
            return flag;
        }
        finally
        {
            exiting = false;
        }
    }
    return flag;
}

答案 2 :(得分:1)

一旦进程终止,就会释放属于它的所有资源。这是由操作系统执行的;一旦进程被杀死,就不会有泄漏的可能性。

垃圾收集器负责在进程的生命周期内管理内存分配;一旦流程退出,它对这些资源的变化没有影响。

也就是说,Application.Exit()不会强制进程终止;它只关闭所有应用程序窗口。是否终止进程取决于进程正在执行的操作。要强制进程退出,请调用Environment.Exit()。