4

我们的应用程序有很多 .NET 程序集,到目前为止,还没有使用 NGen 脚本部署这些程序集,因此它们总是在运行时进行 JIT 处理。

由于我们的应用程序通常部署到终端服务器,让 Windows 共享代码的二进制图像可能比当前的方式更优化,所以我正在研究设置基地址和 NGen'ning 程序集。

所以我在没有任何 NGen 的情况下运行该程序,并使用 [来自 SysInternals 的 listdlls][1] 来查找每个的大小,然后我将其增加到下一类大小(即 xxxx --> 10000)。然后我为我们所有的程序集列出了一个内存列表,并调整了它们的基地址。

到目前为止一切顺利,listdlls我现在可以看到我们的程序集都没有在运行时重新设置基础。

但是,如何测量两个实例之间实际共享的内存量?基本上,假设我在未对程序集执行 NGEN 的情况下启动程序的两个实例,然后在执行 NGEN 后再次执行。

我应该查看什么样的数字,从哪个工具中找到实际效果(如果有的话)?

例如,我知道重新定位我们的程序集的行为可能会移动我们使用的第 3 方程序集(例如 DevExpress 组件),因此它们突然必须重新定位,然后整个事情就是洗牌。

那么,我从哪里读取哪些数字?比如,我是否使用任务管理器的工作集?私人记忆?提交大小?之前和之后的空闲内存?

有什么建议吗?

4

2 回答 2

2

对您来说唯一有意义的值是进程的 Private Bytes,它是进程之间不可共享的分配的字节数(无论在哪里)。

我找不到来源,但当前的 .Net 也可以共享(一些)程序集而不是 ngend。

编辑:我也会对您关于使用和不使用 ngening 的私有字节更改的发现感兴趣。

于 2010-04-22T13:49:04.743 回答
1

实际上,不再需要在 Vista 或更高版本上进行 rebase。请参阅我对引用此 Microsoft 博客的另一篇文章的回答。该博客解释说,“使用 ASLR,虽然最终位置是每台机器随机的,但对于机器上的每个进程来说都是相同的,这意味着重新定位的数据可以在所有进程之间共享。”

变基的整个过程有点做作,所以这是个好消息!

于 2012-04-11T02:38:38.557 回答