通用语言运行时何时终止?

12
在MSDN的性能部分有一个有用的警告关于字符串池化:链接中指出,池化的字符串对象所分配的内存可能直到公共语言运行时(CLR)终止才会被释放。但是,CLR何时终止呢?
3个回答

2
简单的答案是:当主机(进程)终止时,CLR也会终止。
此外,有一个默认的AppDomain(无法访问)。即使您的AppDomain被卸载,这个AppDomain仍将继续存在。我认为Tigran所指的就是“System”。

你能否解释一下主机进程和托管应用程序之间的区别,并提供一些参考资料? - Tim Barrass
主机进程例如可执行文件"MyApp.exe"。但它也可以是像IIS或SQL Server这样的"服务器"。在这种情况下,它们是进程,并且当您的应用程序(在AppDomain中运行)被卸载/回收时不会终止。我会给您提供参考资料。 - Hezi
因此(在其他一些阅读中折叠),托管进程启动并调用(或在旧版本中使用)_CorExeMain,该函数加载CLR和CRT并处理执行 - 还处理卸载CRT和CLR以在主机进程终止之前。这直接关系到您关于CLR终止与主机进程终止相关的评论。您刚提出的关于IIS和SQL Server的观点对于隐含的问题(“CLR保留内部化字符串有多糟糕”)非常重要 - 谢谢! - Tim Barrass
参考资料:这是一个非常古老的(.Net 1.1)MSDN文章(http://msdn.microsoft.com/en-us/magazine/cc163791.aspx)。但从第二个链接中可以看出,“3个AppDomain的引导”仍然在.Net 4.0中使用,来自此链接[http://social.msdn.microsoft.com/Forums/en-US/ebf549fa-661b-4ec5-88a4-96d033892e0c/is-there-an-appdomain-viewer-available-with-vs-2010]。 - Hezi
谢谢,对我很有帮助。你能否编辑你的答案并加上一条评论,提到主机可能是IIS(或者可能是Windows服务),在这种情况下保留内部字符串可能更为重要? - Tim Barrass

0

这似乎涉及CLR如何管理托管进程的关闭,但并未涉及CLR何时或如何终止?如果答案在第二篇文章中,请摘选并引用相关部分。谢谢。 - Tim Barrass

0

大多数情况下,文档指的是CLR“线程”与您的进程相关联将被终止,正如文档正确地说的那样,在内部字符串中:

公共语言运行时通过维护一个称为intern池的表来保留字符串存储,该表包含在程序中声明或以编程方式创建的每个唯一文字字符串的单个引用。因此,具有特定值的文字字符串的实例仅存在于系统中。

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

CLR对国际化的String对象的引用可以在您的应用程序甚至应用程序域终止后持久存在...

因此,基本上这些数据放置的存储空间超出了您的进程地址空间,因此即使在您的进程终止后,它仍然存在于系统中。


2
这个隐藏的 system 是什么,在进程/应用程序退出后仍然存在于内存中?它是一些共享池,为所有正在运行的 .NET 应用程序存在,并在每个 .NET 应用程序关闭时退出吗?你在哪里看到这个信息的? - leppie
@leppie:这是常见的吗?它在内存中精确停留的位置我不知道,也没有关于此的任何信息,正如您所看到的,我的回答中也没有关于此的信息。但根据文档,空间。如果这个空间在同一台机器上的不同应用程序之间共享,我不能确定,因为我没有找到任何证据。我会假设是的,因为如果不是这样,那么在.NET进程实际终止构造它们之后,没有太多理由将其删除。 - Tigran
我认为这不正确;我认为网络数据没有离开我的进程地址空间。 - Tim Barrass
@TimBarrass:那么在您的应用程序/域终止后,它是否仍然存在? - Tigran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接