【问题标题】:Will Application.Exit() clear memory? Garbage Collector run after exit or before exitApplication.Exit() 会清除内存吗?垃圾收集器在退出后或退出前运行
【发布时间】:2013-08-14 16:03:30
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您退出应用程序运行时,请不要担心为您释放所有内存和资源。

标签: c# winforms garbage-collection


【解决方案1】:

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

【讨论】:

  • 当你的程序有一个来自另一个进程的自动化 COM 对象,而另一个进程永远不会干净地退出,因为在程序退出之前 GC 没有释放 COM 对象上的句柄时,它变得很有趣,创建僵尸参考 :-)
【解决方案2】:

使用像 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;
}

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 2012-06-04
      • 2021-11-22
      • 1970-01-01
      相关资源
      最近更新 更多