Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET JIT';可共享页面中的已分配程序集_.net_Memory_Windows Server 2008_Jit_Ngen - Fatal编程技术网

.NET JIT';可共享页面中的已分配程序集

.NET JIT';可共享页面中的已分配程序集,.net,memory,windows-server-2008,jit,ngen,.net,Memory,Windows Server 2008,Jit,Ngen,在终端服务环境中运行.NET 2.0 WinForms应用程序时,我看到一些无法解释的意外结果。我读到的所有内容都表明,JIT程序集(即,不使用NGen创建本机映像)导致所有代码空间都存储在私有页面中,从而增加了工作集大小/内存压力。但是,实际结果(使用Process Explorer、VMMap和WinDbg进行验证)表明,即使JIT程序集也确实被放置在可共享页面中(并且当应用程序的多个实例运行时,即使在单独的TS会话/用户下,也确实被共享) 有人能解释为什么会这样吗?这是在W2K8服务器环境

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

有人能解释为什么会这样吗?这是在W2K8服务器环境中运行的,因此ASLR解释了为什么每个程序集缺少特定的基址&由此产生的重定基址不会导致问题。不过,这些不是本机PE映像的事实似乎会导致这些程序集的代码存储在私有页面中

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

我发现的最新参考文献在这里,这与我们的实际发现也有所不同:

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

谢谢


编辑:我已经掸掉了所有的.NET/CLR书籍的灰尘,现在已经没有办法用搜索查询来解决这个问题了;谁能帮我消除那种“我不明白发生了什么”的讨厌的唠叨感,从而让我的日子过得更好呢

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

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

然而,即使在您的模块页面中,NGEN也有助于内存使用。当运行时能够加载NGEN映像时,它不必为了JIT代码而读取模块的元数据。我的测试应用程序的JIT版本使用2.3MB的工作集。NGEN版本使用32千字节


NGEN还应该帮助您缩短启动时间。对热启动时间的影响可以忽略不计,但对冷启动时间的影响(节省从磁盘读取所有这些页面)是可以注意到的

除非有确凿的证据表明NGen实际上有助于提高内存使用率(以及环境中启动时间的影响可以忽略不计),否则我们决定不继续生成程序集的本机映像。我仍然想知道为什么我们会看到这种意想不到的行为!谢谢你的回复!我会把事情分解并做一些简单的测试,但我还没有看到相同的结果。从我读到的(以及我引用的博客帖子),我真的应该看到模块页面的不同。另外,CLR仍然需要读取元数据以支持反射、CAS策略检查等;恩根并没有消除这一点。由于这是一个由许多用户运行的基于TS服务器的应用程序,内存使用至关重要,而冷启动时间基本上是无关的。没问题!反射和类似的元数据访问都是惰性的——没有任何东西被急切地加载以支持这些场景。我知道在TS场景中,内存使用是关键因素。我鼓励你阅读这篇文章:,如果你没有。重新查看模块页面时,请查看vmmap中的WS列,而不是size/committed。WS是实际使用的页面大小,我看到的是2.3MB到32KB。祝你好运