Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 共享内存并运行可执行文件的多个副本_C# - Fatal编程技术网

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

C# 共享内存并运行可执行文件的多个副本,c#,C#,我有一个应用程序(winform exe),我运行过几次。这是否意味着我有共享程序集,或者每个实例都有自己的程序集副本?当我运行应用程序时,它使用大约30MB(在任务管理器中),当我运行另一个应用程序副本时,它使用另外30MB 我如何计算它使用了多少内存,如果我运行几个实例,是否可以减少内存的过度使用 问候 JD.当您注意到运行应用程序的第二个副本又使用了30MB内存时,我想您已经回答了自己的问题 应用程序的每个实例都将在自己的进程空间中运行,并且不会与应用程序的任何其他实例共享内存或非文件资源

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

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

问候
JD.

当您注意到运行应用程序的第二个副本又使用了30MB内存时,我想您已经回答了自己的问题

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


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

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

这很复杂

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

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

找到答案的方法是更加熟练地使用任务管理器。您希望在那里添加一些列,并查看“工作集”和“私有工作集”。“工作集”是该进程当前使用的私有和共享页面总数。“专用工作集”是未共享的工作集的数量


为了降低你的内存使用率——首先,从理解你为什么关心开始。如今,机器拥有大量内存,而30MB的内存相对较少。除非你能找到一个令人信服的以客户为中心的理由来解决这个问题,否则就去做别的事情,比如加快你的程序或者增加更多的功能。假设您确实有理由关心,那么为自己准备一些工具——特别是内存分析器。NET内存分析器可以告诉您所有分配的位置和大小

谢谢你的快速回复,克里斯。在GAC中注册使用过的程序集怎么样。这会有帮助吗?我不这么认为-但我没有像以前那样深入研究GAC,所以我不能肯定。不,它们仍然需要加载到进程的内存中。此外,您当前在WinForms应用程序中使用的大多数程序集可能已经在GAC中。您忽略了windows具有虚拟内存系统这一事实。共享磁盘映像将只加载到物理内存中一次,然后这些物理页面将映射到每个进程的虚拟内存中。这是一个好主意。会有一些额外的内存使用,但少于应用程序的完整副本。它是静态链接还是动态链接?