我正在开发一个应用程序套件,其中包含几个用户可以根据需要运行的应用程序(它们可以同时运行,或者只运行几个......)。
我关心的是每个进程的物理内存占用量,如任务管理器所示。
我知道框架在窗帘后面执行内存管理,因为它将部分内存用于与我的应用程序没有直接关系的某些内容。
问题。 当有多个进程同时运行时,.NET Framework是否有某种方法可以最小化其运行的进程的内存占用量?( Noobish think ahead )就像,如果System.dll已经被一个进程加载,框架是否为每个进程加载它,或者它有某种方式在进程之间共享它?
我决不打算尽可能地编写小型(资源方面)应用程序(如果我是,我可能不会首先使用.NET Framework),但如果有什么我可以做某事关于过度使用资源,我想了解它。
答案 0 :(得分:5)
当NGEN用于预JIT程序集时,它以这样的方式完成:如果将相同的程序集加载到多个进程中,则可以在它们之间共享可执行代码(否则每个进程必须具有两者的副本)原始IL和JIT编译的代码)。
框架中的大多数(全部?)基础库都是在部署安装框架时编译的NGEN(也是为了减少.NET应用程序的初始启动时间)
Rico是无可争议的专家:http://blogs.msdn.com/b/ricom/archive/2004/10/18/244242.aspx
此外,许多页面可以跨进程共享,因此我们希望鼓励将可共享代码放入ngen'd图像中 - 无法共享jitted代码。
答案 1 :(得分:1)
Windows操作系统可以最大限度地减少多个进程的内存占用。它被称为 paging 。
答案 2 :(得分:1)
CLR和JIT编译器是常规的Windows DLL。只有一个代码实例加载到虚拟内存中,其页面由任何.NET进程共享。他们的数据对每个流程都是私有的。对于.NET框架中的任何程序集都是如此,当它们安装在计算机上时,它们就被引用了。对于您自己的代码可能不是这样,JIT编译的代码是不可共享的。由于您不经常多次运行相同的程序,因此很少有一点。
正如.NET自动管理内存一样,Windows也是如此。您可以做的唯一事情是通过设置Process.MaxWorkingSet强制您的程序经常换出到磁盘。这不明智。最小化应用程序的主窗口也可以完成。
根据经验,您无法在自己的程序中做出正确的决定并正确猜测是否修剪工作集是明智的。您不知道正在运行的其他进程以及它们需要多少RAM。 Windows确实。
答案 3 :(得分:0)
我不希望.net框架做这样的事情,我喜欢这样。原因是我不相信.net框架为每个进程进行状态管理。我的意思是,如果DLL由两个进程共享,则每种情况的上下文和状态可能不同,我们可能需要不同的实例。
例如,让我们拿winword.exe - 如果两个进程打开了两个不同的文件,那么在内存中会运行两个winword实例。我不希望.net f / w干涉这一点,特别是涉及COM世界时。
但是,如果你不希望同时运行多个实例,我会把它留给DLL本身变得如此聪明,表现得像单身一样。