1

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

我对释放应用程序所持有的内存的过程有点困惑。即当我打电话时Application.Exit(),这会在内部打电话,还是先打电话给自己GC.Collect()会更好,然后再打电话?GC.Collect()Application.Exit()

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

4

3 回答 3

4

我相信您的主要问题是您将全局资源与流程资源混淆了。垃圾收集器负责管理进程内的内存。它是一种进程资源,对系统中其他进程可用的内存没有影响。GC 是否在 exit 之前运行对系统上的其他进程来说是不感兴趣的

于 2013-08-14T16:19:07.850 回答
1

使用像 NET 这样的框架的一个好处是不用担心这些细节。
当然,您需要尽量降低内存使用率,但是释放应用程序使用的 MANAGED 内存的工作负载是保留给框架的工作,不会因为您的应用程序被终止而停止清理内存引用应用程序.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;
}
于 2013-08-14T16:13:28.130 回答
1

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

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

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

于 2013-08-14T17:16:03.570 回答