代码之家  ›  专栏  ›  技术社区  ›  Lasse V. Karlsen

如何在NGEN之前测量正确重新设置.NET程序集的钢筋的效果?

  •  4
  • Lasse V. Karlsen  · 技术社区  · 15 年前

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

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

    因此,我运行这个程序时没有使用NGEN,而是使用[listdlls from SysInternals][1]来查找每一个的大小,然后将其增加到下一个大小类(即XXXX-->10000)。然后我为我们所有的程序集列出了一个内存列表,并调整了它们的基地址。

    到目前为止还不错, listdlls 我现在可以看到,我们的程序集没有在运行时进行重新平衡。

    但是,如何度量两个实例之间实际共享的内存量?基本上,假设我启动了程序的两个实例而没有在程序集上执行ngen,然后在执行了ngen之后,再执行一次。

    我应该看哪种数字,从哪种工具,以找出实际效果,如果有的话?

    例如,我知道重新调整程序集的行为可能会移动我们使用的第三方程序集(例如devexpress组件),使它们突然必须重新调整,然后整个过程就是一次清洗。

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

    有什么建议吗?

    2 回复  |  直到 13 年前
        1
  •  2
  •   Foxfire    15 年前

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

    我找不到源,但AFair当前的.NET也可以共享(某些)程序集而不被发送。

    编辑:我也会对你关于私有字节的变化的发现感兴趣。

        2
  •  1
  •   Community CDub    8 年前

    事实上,不再需要在Vista或更高版本上重新设置。见 my answer to another post 指的是 this Microsoft blog . 博客解释说,“使用aslr,虽然最终位置是每台机器随机的,但对于机器上的每个进程来说都是相同的,这意味着重新定位的数据可以在所有进程之间共享。”

    再平衡的整个过程有点矫揉造作,所以这是个好消息!

    推荐文章