【问题标题】:Multiple .NET processes memory footprint多个 .NET 进程内存占用
【发布时间】:2010-06-10 14:01:56
【问题描述】:

我正在开发一个应用程序套件,其中包含多个应用程序,用户可以根据需要运行这些应用程序(它们可以同时运行,也可以只运行几个......)。

我关心的是每个进程的物理内存占用,如任务管理器中所示。

我知道框架在幕后进行内存管理,因为它将部分内存用于与我的应用程序不直接相关的某些事情。

问题。 当有多个进程同时运行时,.NET Framework 是否有某种方法可以最小化它所运行的进程的内存占用?愚蠢的猜测)比如,如果 System.dll 已经被一个进程加载,框架是否会为每个进程加载它,或者它有某种方式在进程之间共享它?

我绝不会努力编写尽可能小的(资源方面)应用程序(如果我是的话,我可能一开始就不会使用 .NET Framework),但如果有什么我可以做的关于过度使用资源,我想知道。

【问题讨论】:

    标签: .net memory-management


    【解决方案1】:

    当 NGEN 用于预 JIT 程序集时,如果将同一个程序集加载到多个进程中,可执行代码可以在它们之间共享(否则每个进程都必须拥有两个原始 IL 和 JIT 编译的代码)。

    框架中的大多数(全部?)基础库都是在安装框架时进行 NGEN 编译的,部分原因是出于这个原因(也是为了减少 .NET 应用程序的初始启动时间)

    Rico 是这方面无可争议的专家:http://blogs.msdn.com/b/ricom/archive/2004/10/18/244242.aspx

    此外,其中许多页面可以跨进程共享,因此我们鼓励将可共享代码放入 ngen'd 图像中 - 无法共享 jitted 代码。

    【讨论】:

      【解决方案2】:

      Windows 操作系统有一种方法可以最大限度地减少多个进程的内存占用。它被称为分页

      【讨论】:

      • 我不记得那个词了。谢谢!
      【解决方案3】:

      CLR 和 JIT 编译器是常规的 Windows DLL。只有一个代码实例被加载到虚拟内存中,其页面由任何 .NET 进程共享。他们的数据对每个进程都是私有的。对于 .NET 框架中的任何程序集也是如此,它们是在计算机上安装 .NET 时进行的。您自己的代码可能不是这样,JIT 编译的代码不可共享。很少有任何意义,因为您通常不会多次运行同一个程序。

      正如 .NET 自动管理内存一样,Windows 也是如此。您唯一能做的就是通过设置 Process.MaxWorkingSet 强制您的程序经常换出到磁盘。这是不明智的。最小化应用程序的主窗口也可以做到这一点。

      根据经验,您无法在自己的程序中做出正确的决定并正确猜测修剪工作集是否明智。您不知道正在运行哪些其他进程以及它们需要多少 RAM。 Windows 可以。

      【讨论】:

        【解决方案4】:

        我不希望 .net 框架做这样的事情,我喜欢这样。原因是我不相信 .net 框架来为每个进程进行状态管理。我的意思是,如果一个 DLL 由两个进程共享,则每种情况的上下文和状态可能不同,我们可能需要不同的实例。

        例如,我们以 winword.exe 为例——如果两个进程打开了两个不同的文档,那么内存中就会运行两个 winword 实例。我不希望 .net f/w 干预这一点,尤其是在涉及 COM 世界时。

        但是,如果您不希望多个实例同时运行,我会将它留给 DLL 本身让它变得如此智能,表现为单例。

        【讨论】:

          猜你喜欢
          • 2019-06-04
          • 2016-07-19
          • 2010-09-18
          • 2011-06-25
          • 2012-09-15
          • 1970-01-01
          • 2012-02-13
          • 2011-09-20
          • 1970-01-01
          相关资源
          最近更新 更多