DLL、内存映射、基地址、内存使用和.NET?

2024-01-07

在开始真正的问题之前,我想说的是,我可能会弄错一些细节。如果是这样,请逮捕我,甚至不要回答我的问题。

我的问题基本上是关于 DLL 和 .NET。我们有一个应用程序使用了大量内存,我们正在尝试找出如何正确测量内存的方法,特别是当问题主要发生在客户端计算机上时。

让我印象深刻的一件事是,我们有一些相当大的 .NET 程序集,其中包含生成的 ORM 代码。

如果我使用具有唯一基地址的非托管 (Win32) DLL,则同一台计算机上的多个并发进程会将 DLL 加载到物理内存中一次,然后将其映射到所有应用程序的虚拟内存中。因此,该 DLL 将使用一次物理内存。

问题是 .NET 程序集会发生什么情况。该 DLL 包含 IL,尽管这部分内容可能在应用程序之间共享,但是从该 IL 生成的 JIT 代码又如何呢?是共享的吗?如果不是,我该如何衡量以确定这实际上是否导致了问题? (是的,我知道,它会有所帮助,但我不会花太多时间在这上面,直到它成为最大的问题)。

另外,我知道我们还没有查看解决方案中所有 .NET 程序集的基地址,.NET 程序集是否有必要这样做?如果是这样,是否有一些关于如何确定这些地址的指南?

任何对此领域的见解都将受到欢迎,即使事实证明这不是一个大问题,甚至根本不是一个问题。


Edit: 刚刚发现这个问题:.NET 程序集和 DLL 变基 https://stackoverflow.com/questions/352519/-net-assemblies-and-dll-rebasing这部分回答了我的问题,但我仍然想知道 JITted 代码如何影响所有这些。

从该问题及其接受的答案看来,JITted 代码放置在堆上,这意味着每个进程将加载共享的二进制程序集映像,并在其自己的内存空间内生成代码的私有 JITted 副本。

我们有什么办法可以衡量这个吗?如果这会生成大量代码,我们就必须更多地查看生成的代码以确定是否需要调整它。


Edit:此处添加了较短的问题列表:

  1. 确保 .NET 程序集的基址是唯一且不重叠的,以避免对主要用于获取 IL 代码进行 JITting 的 dll 进行变基,是否有任何意义?
  2. 如何测量 JIT 代码使用了多少内存来确定这是否确实是一个问题?

答案由@布莱恩·拉斯穆森 https://stackoverflow.com/users/38206/brian-rasmussen here https://stackoverflow.com/questions/479146/dlls-memory-mapping-base-address-memory-usage-and-net#479209表明 JITting 将生成 JITted 代码的每个进程副本,正如我所预期的那样,但重新设置程序集的基址实际上会对减少内存使用产生影响。我将不得不深入研究他提到的 WinDbg+SoS 工具,这些工具我已经在我的清单上有一段时间了,但现在我怀疑我不能再拖延了:)


Edit:我发现了一些关于该主题的链接:

  • 重新设置所有库程序集的基础 http://vanryswyckjan.blogspot.com/2005/11/rebase-all-your-library-assemblies.html
  • MSDN:Win32 DLL 变基:整个故事 http://msdn.microsoft.com/en-us/library/ms810432.aspx

这是针对问题1)

即时代码被放置在一个特殊的堆上。您可以使用以下命令检查该堆!eeheapWinDbg + SoS 中的命令。因此,每个进程都会有自己的即时代码副本。该命令还将显示代码堆的总大小。

如果您需要有关从 WinDbg 获取此信息的更多详细信息,请告诉我。

这是针对问题2)

据书上说.NET 2.0 IL 汇编专家 the .reloc纯 IL PE 文件的一部分仅包含 CLR 启动存根的一个修复条目。因此,在变基期间托管 DLL 所需的修复量相当有限。

但是,如果您列出任何给定的托管进程,您会注意到 Microsoft 已重新调整其大部分(或可能全部)托管 DLL 的基础。这是否应该被视为重新设定基准的原因取决于您。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DLL、内存映射、基地址、内存使用和.NET? 的相关文章

随机推荐

  • YouTube 嵌入 iframe 未在 Safari 中显示

    链接是http thecodeclub org http thecodeclub org 还有一个 YouTube 视频 在 Chrome 中工作正常 但 iframe 在 Safari 中仍为空白 有其他人遇到过这个问题或者有解决办法吗
  • 如何在 JavaScript 中加载文本文件?

    我正在创建一个简单的 WebGL 项目 需要一种加载模型的方法 我决定使用 OBJ 格式 所以我需要一种方法来加载它 该文件 将 存储在服务器上 我的问题是 JS 中的文件如何加载到文本文件中并逐行扫描它 逐个令牌 就像 C 中的流一样 我
  • OpenGL ES 顶点着色器中动态调整大小的数组;用于混合形状/变形目标

    我即将执行混合形状 变形目标的 Opengl ES 实现 但我不太确定执行此操作的最佳方法 我面临的问题是我希望顶点数据的插值发生在 GPU 上 但我也希望混合形状的数量是任意的 澄清一下 我不希望我的顶点着色器看起来像这样 OpenGL
  • Wpf 动画最佳实践 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • async/await 函数内的 JavaScript Promise 解析最终的响应数组

    我是 JavaScript 和 Promises 方面的新手 我正在尝试构建从 API 获得的对象数组 为此 我在一个文件中构建了两个函数MyFile js 当 axios Promise 得到解决时 第一个返回一个 Promise 它是
  • 单击 ActionBar 中的后退按钮时不会调用 onActivityResult

    这是我的问题 创建一个主活动 添加一个按钮来启动另一个活动 SecondActivity Intent i new Intent getActivity SecondActivity class startActivityForResult
  • 使用 Java 进行 PGP 加密和解密 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想使用 PGP 密钥解密文件 我已经下载并安装了 PGP 密钥安装程序 我使用它创建了一个文本文件并使用 PGP 密钥加密了该文本文
  • 用于索引的 Cloud Firestore 通配符

    设置索引时 Cloud Firestore 中通配符级别的语法是什么 我知道有一个安全规则 Thanks Cloud Firestore 索引基于集合名称 不是完整的收集路径 所以如果你想创建索引users id messages 正确的方
  • 依赖注入 - 多个类方法中需要新实例

    我有一些代码看起来像这样 public MyService IDependency dependency dependency dependency public Message Method1 dependency DoSomething
  • 使用 Unix 工具和多列进行排序

    我正在寻找解决这个问题的最简单的方法 我有一个巨大的数据集 无法加载到这种格式的 Excel 中 This is a sentence 10 This is another sentence 5 This is the last sente
  • Delphi #IF(DEBUG) 等效吗?

    Delphi 是否有与 C if DEBUG 编译器指令等效的代码 用这个 IFDEF DEBUG ENDIF
  • 如何使用 imageio 调整图像大小?

    考虑一个图像img类型的imageio core util Array 形状为img is 256 256 3 我想将其调整为 128 128 3 我至少尝试了以下三种 img resize img res pilmode RGB img
  • 从 MySQL 表生成报告

    假设您有一堆 MySQL 表 并且您希望最终用户能够使用 PHP 脚本使用这些数据生成报告 您可以在下拉列表中显示这些表中的字段名称 因此用户可能会说 first name等于约翰 很好 但是 如果您希望这些字段名称更具可读性怎么办 例如
  • moment.js isValid 函数无法正常工作

    我有这个问题 我没有找到任何类似的东西 而且似乎很奇怪没有人在使用 moment js 验证时间时遇到这个问题 moment 03 55 HH mm isValid true moment 03 55jojojo HH mm isValid
  • 检查数组中每个文本框的标签

    如何检查数组中所有 TextBox 控件的 Tag 属性 我想要这样的东西 If textBox Tag And textbox2 Tag And textbox21 Tag And textbox22 Tag And textbox23
  • CSS“snap-scroll”干扰 jQuery“.animatescrollLeft”

    我有一个 html 和 css 滑块 我正在使用scroll snap用于手动滚动和用于自动滚动的 jQuery 按钮 然而 当使用scroll snap type x mandatory jQueryscrollLeft动画变得极其滞后或
  • AngularJS 数据绑定不起作用 - 在控制器范围内变量未显示输入的值

    我有一个奇怪的情况 scope变量绑定似乎没有按预期工作 这是 HTML div class input group style width 100px div
  • 初始化哈希值

    我经常写这样的东西 a hash x a hash x some more text a hash x first text 应该有更好的方法来做到这一点 但我找不到 有两种方法可以为 a 创建初始值Hash 一种是将单个对象传递给Hash
  • 相当于 ftp put 并追加到 scp 中

    我有一个我无法理解的遗留脚本 该脚本是将unix中的4个文件 2个ebcdic格式文件和2个pdf文件 通过ftp传输到主机上 ebcdic format file 1 is abc xyz ebcdic format file 2 is
  • DLL、内存映射、基地址、内存使用和.NET?

    在开始真正的问题之前 我想说的是 我可能会弄错一些细节 如果是这样 请逮捕我 甚至不要回答我的问题 我的问题基本上是关于 DLL 和 NET 我们有一个应用程序使用了大量内存 我们正在尝试找出如何正确测量内存的方法 特别是当问题主要发生在客