我们的应用程序有很多.NET程序集,到目前为止,尚未使用NGen脚本进行部署,因此它们在运行时始终处于JIT状态。
由于我们的应用程序通常部署到终端服务器,因此让Windows共享代码的二进制映像可能比当前方式更优化,所以我正在考虑设置基址和NGen'ning程序集。
所以我在没有任何NGen的情况下运行程序,并使用[来自SysInternals的[listdlls] [1]来查找每个的大小,然后我将其增加到下一个大小类(即xxxx - > 10000)。然后,我为所有程序集布置了一个内存列表,并调整了它们的基本地址。
到目前为止一直很好,listdlls
我现在可以看到我们的程序集都没有在运行时重新定位。
但是,如何衡量两个实例之间实际共享的内存量?基本上,假设我在没有在程序集上执行NGEN的情况下启动程序的两个实例,然后在执行NGEN之后再次执行。
我应该查看哪种数字,以及从哪个工具中查找实际效果(如果有的话)?
例如,我知道这样一个事实,即重新组装我们的程序集的行为可能会移动我们使用的第三方程序集(例如DevExpress组件),以便它们突然必须重新绑定,然后整个事情就是清洗
那么,我从哪里读到哪些数字?比如,我是否使用任务管理器的工作集?私人记忆?提交大小?之前和之后的自由记忆?
有什么建议吗?
答案 0 :(得分:2)
唯一有意义的值是进程的私有字节数,它是在进程之间不可共享的已分配字节数(无论在何处)。
我无法找到一个来源但是当前的流量.Net也可以共享(某些)程序集而不是ngend。
编辑:我也会对你有关使用和不使用ngening的私有字节更改的发现感兴趣。
答案 1 :(得分:1)
实际上,不再需要在Vista或更高版本上进行重新定义。请参阅my answer to another post,其中涉及this Microsoft blog。该博客解释说,“使用ASLR,虽然每台机器的最终位置是随机的,但机器上的每个进程都是相同的,这意味着可以在所有进程中共享重新定位的数据。”
整个变革过程有点过分,所以这是个好消息!