gpt4 book ai didi

可共享页面中的 .NET JIT 程序集

转载 作者:行者123 更新时间:2023-12-01 13:08:51 25 4
gpt4 key购买 nike

在终端服务环境中运行 .NET 2.0 WinForms 应用程序时,我看到了一些无法解释的意外结果。我读过的所有内容都表明,JIT 程序集(即不使用 NGen 创建 native 图像)导致所有代码空间都存储在私有(private)页面中,增加了工作集大小/内存压力。然而,实际结果(使用 Process Explorer、VMMap 和 WinDbg 验证)表明,即使是 JIT 程序集也确实被放置在可共享页面中(并且在有多个应用程序实例运行时确实被共享,即使在单独的 TS 下) session /用户)。

谁能解释为什么会这样?这是在 W2K8 服务器环境中运行的,因此 ASLR 解释了为什么每个程序集缺少特定基地址以及由此产生的 rebase 不会导致问题。尽管如此,这些不是 native PE 镜像的事实似乎应该导致这些程序集的代码存储在私有(private)页面中。

这是在我们开始研究使用 NGen 来减少内存压力时发现的,但实际上发现它增加了工作集大小 - 因为 JIT 程序集已经被共享。

我找到的最新引用文献在这里,它再次与我们的实际发现不同:

http://blogs.msdn.com/morgan/archive/2009/03/07/developing-net-applications-for-deployment-on-terminal-services-or-citrix.aspx

编辑:我应该补充一点,自从第一次发布问题以来,更多关于 Windows Server 2003 测试箱的实验显然也表明 JIT 程序集可以在进程之间共享。我仍然对为什么我能找到的所有建议都表明需要 NGen 感到困惑,但所有现实世界的证据都与此相矛盾。我真的希望这里的专家能给出一些启示。

谢谢!

编辑:我已经把我所有的 .NET/CLR 书籍都掸掉了,但我已经用尽了搜索查询的想法来尝试解决这个问题;谁会通过帮助消除“我不明白发生了什么”的可怕唠叨感来让我开心!?! :)

最佳答案

我认为您正在直接查看模块页面。当您使用 JIT 代码时,它不会出现在您的 DLL 下 - 它会出现在运行时分配的内存中。您正在查看的模块页面主要是元数据和 IL,这就是它们仍然可以共享的原因。

作为实验,我编写了一个生成 30K 个静态方法并调用它们的小程序。在我的系统上,该程序的 JIT 版本有 8.2 MB 的专用内存,而 NGEN 版本有 3.8 MB。

但是,即使在您的模块页面中,NGEN 也确实有助于内存使用。当运行时能够加载 NGEN 图像时,它不必读取模块的元数据来 JIT 代码。我的测试应用程序的 JIT 版本使用 2.3MB 的工作集。 NGEN 版本使用 32 KB。

NGEN 还应该有助于缩短启动时间。对热启动时间的影响可以忽略不计,但对冷启动时间(节省从磁盘读取所有这些页面)的影响却很明显。

关于可共享页面中的 .NET JIT 程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/719587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com