在我开始真正的问题之前,让我先说一下我可能会在这里弄错一些细节。如果是这样,请在这些问题上逮捕我,甚至不要回答我的问题。
我的问题基本上是关于 DLL 和 .NET。我们有一个使用大量内存的应用程序,我们正试图弄清楚如何正确测量这一点,尤其是当问题主要发生在客户的计算机上时。
让我印象深刻的一件事是,我们有一些相当大的 .NET 程序集,其中包含生成的 ORM 代码。
如果我使用具有唯一基地址的非托管 (Win32) DLL,同一台机器上的多个同时进程会将 DLL 加载到物理内存中,然后将其映射到所有应用程序的虚拟内存中。因此,该 DLL 将使用一次物理内存。
问题是 .NET 程序集会发生什么。这个 DLL 包含 IL,虽然它的这一部分可能在应用程序之间共享,但是由这个 IL 产生的 JITted 代码呢?是共享的吗?如果不是,我如何衡量以找出这实际上是否导致了问题?(是的,我知道,它会有所贡献,但在它成为最大的问题之前,我不会花太多时间在这上面)。
另外,我知道我们没有查看解决方案中所有 .NET 程序集的基地址,.NET 程序集是否有必要这样做?如果是这样,是否有一些关于如何确定这些地址的指南?
对此领域的任何见解都将受到欢迎,即使事实证明这不是一个大问题,甚至根本不是问题。
编辑:刚刚发现这个问题:.NET 程序集和 DLL rebase部分回答了我的问题,但我仍然想知道 JITted 代码是如何影响所有这些的。
从该问题及其接受的答案看来,JITted 代码放置在堆上,这意味着每个进程将加载共享的二进制程序集映像,并在其自己的内存空间内生成代码的私有 JITted 副本。
我们有什么方法可以衡量这个吗?如果这会产生大量代码,我们将不得不更多地查看生成的代码以确定是否需要对其进行调整。
编辑:在这里添加了一个较短的问题列表:
- 确保 .NET 程序集的基地址是唯一的且不重叠以避免重新设置主要用于将 IL 代码从 JITting 中提取出来的 dll 是否有任何意义?
- 如何测量 JITted 代码使用了多少内存来确定这是否真的是一个问题?
@Brian Rasmussen 在此处的回答表明,正如我所料,JITting 将生成 JITted 代码的每个进程的副本,但是重新设置程序集实际上会对减少内存使用产生影响。我将不得不深入研究他提到的 WinDbg+SoS 工具,我已经在我的列表中列出了一段时间,但现在我怀疑我不能再推迟了 :)
编辑:我在这个主题上找到了一些链接: