共享内存并运行可执行文件的多个副本

时间:2009-06-21 13:55:38

标签: c#

我有一个应用程序(winform exe),我运行了几次。这是否意味着我有共享程序集或者每个实例都有自己的程序集副本?当我运行应用程序时,它使用大约30MB(在任务管理器中),当我运行该应用程序的另一个副本时,它使用另外30MB。

我如何计算出它使用了多少内存,以及如果我运行多个实例可以减少内存的过度使用?

此致 JD。

3 个答案:

答案 0 :(得分:4)

这很复杂。

首先阅读我最近关于虚拟内存的文章。

http://blogs.msdn.com/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx

好了,既然您已经了解了虚拟内存的工作原理,就可以了解操作系统如何将DLL加载到内存中。假设您有两个进程都需要Foo.DLL的特定页面。操作系统将该页面加载到物理内存ONCE中,然后将该物理页面映射到两个进程的虚拟空间中。因此,正在使用的物理内存量是一个4KB的页面。但是4KB出现在BOTH流程中。您的30MB大部分都可能是共享物理内存。

找出答案的方法是使用任务管理器更加复杂。您想在那里添加一些列,并查看“工作集”和“私人工作集”。 “工作集”是该进程当前正在使用的私有和共享页面总数。 “私人工作集”是未共享的数量。

降低内存使用率 - 首先,首先要了解你关心的原因。机器现在有足够的内存,30MB是相对微小的内存。除非你能找到一个引人注目的以客户为中心的理由来解决这个问题,否则就要开展其他工作,比如让你的程序更快或者添加更多功能。假设你有理由关心,给自己一些工具 - 尤其是内存分析器。 .NET内存分析器可以告诉您所有分配的位置以及它们的大小。

答案 1 :(得分:1)

如果您没有静态资源,则可以在应用程序启动时添加新线程,而不是使用第二个进程,并且其实例已存在。这就是Firefox所做的。

答案 2 :(得分:0)

当您发现运行应用程序的第二个副本使用另外30MB的内存时,我认为您已回答了自己的问题。

应用程序的每个实例都将在其自己的进程空间中运行,并且不会与应用程序的任何其他实例共享内存或非文件资源。

在不知道你的应用程序做了什么的情况下,我能够想到(目前)减少它使用的内存量的唯一方法是将数据写入磁盘。这会释放内存,因为这些对象超出了范围 - 但是当你从磁盘读回数据时显然会被重用。