在进程之间共享dll - 虚拟内存似乎没有受益

gal*_*arm 1 .net c# memory dll memory-management

我的意图是我的应用程序之间的共享dll,例如,如果我有2个应用程序加载20MB dll,而不是一个使用200MB内存的进程和另一个200MB内存,其中一个将受益于共享和仅使用180MB记忆.我的问题是内存的定义,请继续阅读.

我创建了2个.net c#应用程序,它们引用并运行位于GAC中的大型dll(20MB)代码.使用.NET Memory Profiler,我可以看到第二个进程使用的实际物理内存确实明显低于首先启动的物理内存(尽管它们是相同的)并且dll位于第一个进程的共享内存下处理.然而,当使用perfmon检查内存计数器时,我发现两个应用程序的虚拟内存增加(与dll的大小相关)增加了相同的大小,当单独运行每个应用程序时,它们会增加.

这导致了一个问题:如果只有物理内存从中受益,那么共享(内存经济智能)dll会有什么意义,而虚拟内存(从应用程序的角度来看)是重要的.

编辑:谢谢你的回答.根据答案,我想强调一点,我理解在内存中共享dll以节省物理内存的好处.我应该问的更精确的问题是:在.net中的应用程序之间共享dll的方式是否有任何好处,应用程序明智(不是系统方面的)?我问这个的原因是因为我关心我的应用程序正在使用的虚拟内存量(总计).

Han*_*ant 7

RAM很重要.虚拟内存不需要任何费用,它是虚拟的.共享相同RAM的多个进程是一个大问题.任何Windows进程都依赖于kernel32.dll.但是在RAM中只有一个代码副本.

利用托管程序中的进程共享代码需要运行ngen.exe,以便它们都能获得完全相同的机器代码.如果代码是即时编译的,则无法共享任何内容.