.NET程序集内存使用情况

时间:2013-05-20 15:46:36

标签: c# .net dll .net-assembly

假设我有两个完全独立的.NET应用程序,Foo.exeBoo.exe,它们都使用位于Foo和Boo的bin文件夹中的同一个库TestLib.dll(两份)。

.NET会加载这两个dll,浪费size_of_dll * 2大小的RAM还是会检查强大的程序集名称,大小等......并且只加载和加载两个程序集中的一个?

5 个答案:

答案 0 :(得分:4)

你是正确的,DLL的一个功能是使用该DLL的多个进程可以共享某些部分以减少内存使用(这是一个Windows功能,并不是特定于.Net),但我相当肯定要使其工作,两个进程必须在磁盘上加载相同的物理DLL,在这种情况下,这不会发生在您描述的场景中。

如果您安装到公共位置(例如GAC),那么Windows将能够跨多个进程共享DLL的某些部分以节省内存。对于.net程序集,您还需要NGen the assembly in order to take advantage of this

请注意,“已保存”的内存量为 size_of_dll,因为无法共享该DLL映像的某些部分,即可以修改的该DLL的任何部分。这些部分仍然在多个进程中重复,以确保应用程序不会意外地修改彼此的数据。

答案 1 :(得分:2)

是的,每个AppDomain都会加载一次DLL。但是,您可以跨多个AppDomain共享DLL以减少内存使用量。如此code project article中所述。

  

如果程序中的多个域使用了程序集,那么   程序集的代码(但不是其数据)可以由所有域共享   引用程序集。这减少了使用的内存量   运行时间。

答案 2 :(得分:2)

如果您希望多个进程共享同一个程序集,则有两个选项:

  1. 您可以将程序集放在GACGlobal Assembly Cache中。您可以使用GacUtil
  2. 执行此操作
  3. 您可以使用配置文件和codeBase元素在一小组应用程序中共享私有部署的程序集。

答案 3 :(得分:2)

使用两个.net 4.0项目,一个类库和Process Explorer对此进行测试 - 默认情况下,Visual Studio将引用的dll复制到项目的bin目录。

Process Explorer为引用的dll返回两个不同的地址,而为其他特定于Windows的库返回相同的地址。

结论:是的,对于两个应用程序加载的不同文件夹中同一个库的两个副本,同一个库可能会被加载两次。

答案 4 :(得分:0)

我认为你在询问程序集的代码是每个进程加载一次还是在本机dll之类的进程之间共享。答案不是主要因为代码不是本机的,而且必须是JIT。 Jitting按程序进行。预先组装的组件(ngen)能够共享代码。