在我开始真正的问题之前,让我只是说我可能会得到一些这里的细节错误.如果是这样,请将我拦截,甚至不回答我的问题.

我的问题是关于DLL和.NET,基本上.我们有一个应用程序使用相当多的内存,我们正在努力弄清楚如何正确地测量,特别是当问题主要发生在客户端的计算机上时.

有一件事就是我们有一些比较大的.NET程序集,其中包含生成的ORM代码.

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

问题是.NET程序集会发生什么.此DLL包含IL,虽然这部分可能在应用程序之间共享,但是由此IL产生的JITted代码呢?是分享吗?如果没有,我如何衡量,这是否真的有助于问题? (是的,我知道,它会有所贡献,但是我不会花太多时间在这里,直到它是最大的问题).

此外,我知道我们没有在我们的解决方案中查看所有.NET程序集的基址,.NET程序集是否需要这样做?如果是,有没有一些指导方针可以确定这些地址?

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

编辑:刚刚发现这个问题:.NET assemblies and DLL rebasing这部分地回答了我的问题,但我仍然想知道如何将JITTED代码的因素纳入所有这一切.

从该问题及其接受的答案中可以看出,JITted代码放在堆上,这意味着每个进程将加载共享的二进制汇编映像,并在其自己的内存空间中产生一个专用的JITTED代码.

我们有办法衡量这个吗?如果这样就产生了大量代码,那么我们必须先看看生成的代码,以确定是否需要调整它.

编辑:在这里添加一个较短的问题列表:

>确保.NET程序集的基本地址是唯一的且不重叠的,以避免重新使用大部分用于仅将IL代码用于JITting的dll的任何意义?
>如何测量JITED代码使用了多少内存,以确定这是否真的是一个问题?

@Brian Rasmussen here的答案表明,JITting将按照我预期的方式生成JITTED代码的每个进程副本,但是对于减少内存使用而言,这些修订程序集实际上会产生影响.我必须挖掘他提到的WinDbg SoS工具,我在我的名单上有一段时间,但现在我怀疑我不能再把它关掉了:)

编辑:我找到的一些链接:

> Rebase all your library assemblies
> MSDN: Rebasing Win32 DLLs: The Whole Story

这是问题1)

这些代码放在特殊的堆上.您可以使用WinDbg SoS中的!eeheap命令检查此堆.因此,每个进程都将有自己的备份代码.该命令还将显示代码堆的总大小.

如果您想要从WinDbg获取此信息的其他详细信息,请告诉我们.

这是问题2)

根据专家.NET 2.0 IL程序集,纯IL PE文件的.reloc部分仅包含CLR启动存根的一个fixup条目.因此,在重新加载期间,受管理的DLL所需的修复量相当有限.

但是,如果列出任何给定的托管过程,您会注意到Microsoft已经重新批量(或许所有)他们的托管DLL.是否应该被视为退换原因呢由你决定.

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

  1. 《从零开始学Swift》学习笔记Day 71——Swift与C/C++混合编程之数据类型映射

    而在Swift语言中是不能直接使用C数据类型,苹果公司为Swift语言提供与C语言相对应数据类型。代码中CUnsignedChar是将Int类型转化为C语言unsignedchar类型,在Swift中使用CUnsignedChar表示。从表可见针对C语言多样的指针形式,Swift主要通过提供了三种不安全的泛型指针类型:UnsafePointer、UnsafeMutablePointer和AutoreleasingUnsafeMutablePointer。T是泛型占位符,表示不同的数据类型。另外,还有cop

  2. 《从零开始学Swift》学习笔记Day 71――Swift与C/C++混合编程之数据类型映射

    而在Swift语言中是不能直接使用C数据类型,苹果公司为Swift语言提供与C语言相对应数据类型。代码中CUnsignedChar是将Int类型转化为C语言unsignedchar类型,在Swift中使用CUnsignedChar表示。从表可见针对C语言多样的指针形式,Swift主要通过提供了三种不安全的泛型指针类型:UnsafePointer、UnsafeMutablePointer和AutoreleasingUnsafeMutablePointer。T是泛型占位符,表示不同的数据类型。另外,还有cop

  3. Windows环缓冲区无需复制

    在RingBuffer’sWikipediaentry,有examplecode显示UNIX系统的黑客,其中相邻虚拟内存到一块内存是mapped到相同的物理内存,因此实现了一个环形缓冲区而不需要任何memcpy等.我想知道是否有办法在Windows这么类似的东西?谢谢,弗雷泽我并没有真正遵循维基百科中的示例的所有细节.考虑到这一点,您使用CreateFileMapping和MapViewOfFile在Windows中映射内存,但MapViewOfFile不允许您为映射指定基址.MapViewOfFileE

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

    .此外,我知道我们没有在我们的解决方案中查看所有.NET程序集的基址,.NET程序集是否需要这样做?如果这样就产生了大量代码,那么我们必须先看看生成的代码,以确定是否需要调整它.编辑:在这里添加一个较短的问题列表:>确保.NET程序集的基本地址是唯一的且不重叠的,以避免重新使用大部分用于仅将IL代码用于JITting的dll的任何意义?

  5. php – 在javascript中实现支持对象方法作为映射函数的映射?

    我最近尝试在javascript中使用map的实现来创建一堆项目,然后将它们应用于对象添加方法.首先是沼泽标准的地图实现.建立.而我的功能……无论如何,我的问题是,我怎样才能实现map来实际支持使用对象方法作为我的映射函数?

  6. Windows进程的内存映射如何?

    这可能是一个重复的问题.我想知道一个windows进程的内存映射怎么样?

  7. windows下进程间通信

    MicrosoftWin32API提供了多种进程间通信的方法,全面地阐述了这些方法的特点,并加以比较和分析,希望能给读者选择通信方法提供参考。MicrosoftWin32应用编程接口提供了大量支持应用程序间数据共享和交换的机制,这些机制行使的活动称为进程间通信,进程通信就是指不同进程间进行数据共享和数据交换。但剪贴板只能在基于Windows的程序中使用,不能在网络上使用。大多数基于Windows的应用程序都支持DDE。

  8. java – 域模型映射器应该是静态的吗?

    在我参与的许多项目中,我们经常会有很多类将内容从一个域模型映射到另一个域模型.例如,从WSDL生成的模型到项目特定的模型.例如这也可以是一个非静态方法,服务层可以有一个映射器对象字段,而不是调用静态方法:我发现两种方法都使用了很多,但是:>以任何方式提高效率的解决方案之一?>任何解决方案都被认为是最佳实践吗?

  9. java – 从数据库获取数据与从哈希映射获取数据

    在我的android*项目*我必须跟踪一定数量的产品的产品细节.这些产品上的所有数据都存储在sqlite数据库中.我可以在sqlite中使用select和update来跟踪产品对象.因此,我可以在更改时存储产品详细信息.此外,我可以在开始时将所有产品加载到哈希映射或此类数据结构中,并跟踪这些产品对象.对我而言,最重要的是哪一个更有效率和更高效.有人能帮我吗.谢谢!

  10. 如何在Java中映射(mmap)linux块设备(例如/ dev / sdb)?

    我可以使用java.nio读取/编写带有Java的linux块设备.以下代码有效:但是,内存映射不起作用.以下代码失败:这失败,错误:有没有解决这个问题?我在某个地方读过,可能是通过使用JNI,我可以做到这一点,但我找不到任何来源.解决方法根据documentation,实际映射文件的机制留给实现.似乎实现正在尝试截断文件(可能是因为块设备大小与您指定的大小不同?

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部