【问题标题】:When does the common language runtime terminate?公共语言运行时何时终止?
【发布时间】:2013-12-19 11:32:16
【问题描述】:

string interning on MSDN 的性能部分有一个有用的警告:

在公共语言运行时 (CLR) 终止之前,分配给实习字符串对象的内存可能不会被释放。

但是:CLR 什么时候终止?

【问题讨论】:

    标签: c# .net clr


    【解决方案1】:

    简单的答案是:CLR 在主机(进程)终止时终止。

    此外,还有一个默认的 AppDomain(不可访问)。即使您的 AppDomain 已卸载,此 AppDomain 仍将继续存在。这就是我认为 Tigran 所指的系统

    【讨论】:

    • 您能否通过一些参考说明宿主进程和托管应用程序之间的区别?
    • 主机进程例如是可执行文件“MyApp.exe”。但它也可以是 IIS 或 SQL Server 等“服务器”。在这种情况下,它们是进程并且不会在您的应用程序(在 AppDomain 中运行)被卸载/回收时终止。我会用参考回复你。
    • 因此(折叠在其他阅读中)托管进程启动并调用(或在旧版本中用于)_CorExeMain,它加载 CLR 和 CRT 并处理执行 - 并且还处理卸载 CRT和 CLR 在主机进程终止之前。这与您对与主机进程终止相关的 CLR 终止的评论直接相关。您刚刚提出的关于 IIS 和 SQL Server 的观点对于隐含的问题很重要(“CLR 对实习字符串的持有有多糟糕”)——谢谢!
    • 参考:这是非常古老的 (.Net 1.1) MSDN 文章 (msdn.microsoft.com/en-us/magazine/cc163791.aspx)。但是从第二个链接看来,“3 AppDomain's bootstrapping”仍在此链接中的.Net 4.0中使用[social.msdn.microsoft.com/Forums/en-US/…
    • 对我有好处,谢谢。您能否编辑您的答案以包含有关主机可能是 IIS(或者可能是 Windows 服务)的评论,在该主机上保留实习字符串可能更重要?
    【解决方案2】:

    有一篇很好的代码项目文章详细介绍了包括 CLR 终止在内的生命周期。

    http://www.codeproject.com/Articles/16164/Managed-Application-Shutdown

    该文章的灵感来自:http://blogs.msdn.com/b/cbrumme/archive/2003/08/20/51504.aspx

    【讨论】:

    • 这似乎解决了 CLR 如何管理托管进程的关闭,但没有处理 CLR 如何或何时终止?如果答案在第二篇文章中,你能挑出并引用相关部分吗?谢谢
    【解决方案3】:

    最可能的文档是指与您的进程关联的 CLR“线程”将被终止的事实,正如文档正确地说的那样,该字符串:

    公共语言运行时通过维护一个 表,称为实习生池,其中包含对 以编程方式声明或创建的每个唯一文字字符串 你的程序。因此,文本字符串的实例具有 特定值在系统中只存在一次。

    而不是在您的应用程序中。事实上,进一步阅读它说:

    CLR 对实习字符串对象的引用可以在您的 应用程序,甚至您的应用程序域,终止...

    因此,基本上放置这些数据的存储空间超出了您的进程地址空间,因此在您的进程终止后仍保留在 system 事件中。

    【讨论】:

    • 在进程/应用程序退出后,这个隐藏在内存中的system 是什么(?)?它是所有正在运行的 .NET 应用程序都存在并在每个 .NET 应用程序关闭时退出的公共池吗?您在哪里看到的这些信息?
    • @leppie:这是常见的还是它精确地留在记忆中的地方我不知道,也没有关于它的信息,正如你所见,我的回答中没有任何信息。但根据文档, there is space 。如果这在同一台机器上的不同应用程序之间共享,也不能说,因为我没有找到任何证据。我会假定是的,因为如果不是,那么在实际构造它们的.NET 进程终止后,non 删除它的原因并不多。
    • 我认为这不对;我认为实习数据不会超出我的进程的地址空间。
    • @TimBarrass:那么它在您的应用程序/域终止后仍然存在吗?
    猜你喜欢
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多