如何在NGen之前测量正确重新设置.NET程序集基址的效果?

如何在NGen之前测量正确重新设置.NET程序集基址的效果?,.net,memory,assemblies,ngen,rebasing,.net,Memory,Assemblies,Ngen,Rebasing,我们的应用程序有很多.NET程序集,到目前为止,这些程序集还没有使用NGen脚本部署,因此它们总是在运行时进行JIT 由于我们的应用程序通常部署在终端服务器上,因此让Windows共享代码的二进制映像可能比当前的方式更为理想,因此我正在考虑设置基址和加密程序集 因此,我在不使用NGen的情况下运行了该程序,并使用[listdlls from SysInternals][1]查找每个的大小,然后将其增加到下一个大小类(即xxxx-->10000)。然后,我为所有程序集列出了一个内存列表,并调整了所

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

由于我们的应用程序通常部署在终端服务器上,因此让Windows共享代码的二进制映像可能比当前的方式更为理想,因此我正在考虑设置基址和加密程序集

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

到目前为止还不错,通过
listdll
我现在可以看到,没有一个程序集在运行时被重定基址

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

为了发现实际效果,我应该看什么样的数字,从哪种工具看,如果有的话

例如,我意识到这样一个事实,对我们的程序集重新设置基址的行为可能会移动我们使用的第三方程序集(例如,DevExpress组件),使它们突然必须重新设置基址,然后整个过程就是清洗

那么,我从哪里读到哪些数字?比如,我是否使用任务管理器的工作集?私有内存?提交大小?前后释放内存


有什么建议吗?

对您来说唯一有意义的值是进程的私有字节,它是分配给进程之间不可共享的字节数(无论在何处)

我找不到源,但afair current.Net也可以共享(某些)程序集,而无需ngend


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

实际上,不再需要在Vista或更高版本上重新设置基础。看看哪个是指。该博客解释说,“使用ASLR,虽然最终位置在每台机器上是随机的,但机器上的每个进程都是相同的,这意味着重新定位的数据可以在所有进程之间共享。”


重定基址的整个过程有点做作,所以这是个好消息

我对这一点很感兴趣,也是因为我们的客户打算通过终端服务运行我们的应用程序。我正在使用Process Explorer,但我还没有足够的知识来理解它告诉我的内容。真遗憾,没有人能更深入地回答这个问题。如果人们对这个话题不感兴趣,那是什么呢?我把这个答案投了赞成票,因为它与我到目前为止读到的所有内容一致,我也对老年退休金计划的调查结果非常感兴趣,因为在这个网站上所有的专家中,没有其他人有谈论这个话题的冲动。