c# - 共享内存和运行可执行文件的多个副本

标签 c#

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

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

问候 京东。

最佳答案

这很复杂。

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

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

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/

相关文章:

c# - 为每个 ID 选择具有最大日期的值

C# - 密码数据库

c# - 尝试显示 ListView 中的默认选定值

C# 从命令行加载文件?

c# - 从桌面应用程序 (.Net 2) 调用 WebService (WCF) 时的消息大小

c# - 如何在 C# 中传递和使用泛型对象?

c# - 创建 ActionBlock<T> 列表,该列表将在任何失败时完成

c# - 与 C#/WinForms 中经过深度优化的 GDI 代码相比,SharpDX 可以带来多少改进?

c# - 从具有抽象属性的泛型类继承

c# - 是否可以使用 Json.Net 以不同的方式序列化对象并反序列化它?