我有一个运行多次的应用程序 (winform exe)。这是否意味着我有共享程序集或每个实例都有自己的程序集副本?当我运行该应用程序时,它使用了大约 30MB(在任务管理器中),当我运行该应用程序的另一个副本时它又使用了 30MB。
我如何计算出它使用了多少内存,如果我运行多个实例,我是否可以减少内存的过度使用?
问候 京东。
最佳答案
这很复杂。
首先阅读我最近关于虚拟内存的文章。
OK,既然你对虚拟内存的工作原理有了一些了解,你就可以了解操作系统如何将 DLL 加载到内存中了。假设您有两个进程都需要 Foo.DLL 的特定页面。操作系统会一次性将该页面加载到物理内存中,然后将该物理页面映射到两个进程的虚拟空间中。因此,正在使用的物理内存量是一个 4KB 页面。但是这 4KB 出现在两个进程中。您的 30MB 中的大部分很可能是共享物理内存。
找出答案的方法是更熟练地使用任务管理器。你想在那里添加一些列并查看“Working Set”和“Private Working Set”。 “工作集”是该进程当前使用的页面总数,包括私有(private)和共享页面。 "Private Working Set"是不共享的数量。
要降低您的内存使用率——好吧,首先,请先了解您关心的原因。现在机器有足够的内存,而 30MB 是一个相对较小的内存量。除非你能找到一个令人信服的以客户为中心的理由来解决这个问题,否则就去做其他事情,比如让你的程序更快或添加更多功能。假设您确实有理由关心,那就为自己准备一些工具——尤其是内存分析器。 .NET 内存分析器可以告诉您所有分配的位置和大小。
关于c# - 共享内存和运行可执行文件的多个副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1023950/