首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么创建转储文件操作会极大地增加工作集(内存)的大小?

为什么创建转储文件操作会极大地增加工作集(内存)的大小?
EN

Stack Overflow用户
提问于 2014-09-19 10:06:34
回答 1查看 1K关注 0票数 1

我使用C#编写了一个Hello-world控制台应用程序。

代码语言:javascript
复制
class Program
{
  static void Main(string[] args)
  {
    Console.WriteLine("Hello World");

    Console.Read();
  }
}

,当我启动它时,它所占用的记忆是:

然后,我尝试创建这个进程的转储文件:

在创建转储之后,该进程占用的内存如下:

你可以看到工作装置尺寸发生了很大的变化,这对我来说是个惊喜。

关于这个内存增量的其他有趣之处是:

  1. 在我的进程内存工作集增加到46 MB之后,它似乎不再减少到7MB了。
  2. 转储文件的大小不是7MB,而是46 MB。
  3. 私有工作集从1.83MB增加到2.29MB

下面是我的问题:

1.为什么在创建转储操作的同时还会增加内存?

2.在过去,当测试人员报告内存泄漏问题并向我发送转储文件时,我将转储文件大小视为目标进程在实验室环境中的内存大小。但从上面这个简单的例子来看,我似乎总是错了?

3.我对46 MB转储文件中的内容非常好奇(换句话说,我非常好奇当前hello world应用程序为什么占用了46 MB内存)。我熟悉SOS命令,如!DumpHeap或!ee堆,但这些命令不足以告诉46 am大小文件中的所有内容。有人能分享一些有用的工具、链接或说明吗?

非常感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-19 19:51:25

在95%的情况下(或者更多的情况下,我没有关于它的统计数据),您不必担心工作集。Microsoft选择工作集列作为任务管理器的默认列是一种误导。

应用程序需要的内存称为虚拟内存。您可以区分三种不同类型的虚拟内存:

  1. 保留内存,它既不存在于RAM中,也不存在于磁盘上
  2. 已提交的内存,该内存目前不需要,因此写入磁盘。
  3. 提交内存,这是当前需要的,因此可以在RAM中供CPU访问。这就是所谓的工作集。

Windows减少或增加工作集的原因有很多。在许多情况下,原因可以在其他应用中找到,而不是你的。但是,在您描述的情况下,很明显:

  1. 调试器挂起进程。
  2. 调试器创建一个新线程并触发MiniDumpWriteDump函数。
  3. 该函数需要读取所有已提交的内存,以便将其写入转储。
  4. 当访问虚拟内存时,内存中已被分页到磁盘的部分需要传回RAM。
  5. 如前所述,RAM中的虚拟内存称为工作集,因此工作集会增加。

然而,它仍然取决于您在创建转储时对您的PC所做的其他事情。尝试运行多线程应用程序,在转储进程时大量使用内存。您可能会发现Windows考虑到了这种情况,在内存分页之前,它会分页删除您自己进程的内存。在这种情况下,工作集将不会像在屏幕截图中增加的那么多。

所以,再说一遍:不要担心工作环境。Windows只是认为它有足够的RAM来加快转储创建过程。很可能是因为它使用了未使用的内存,或者减少了用于磁盘缓存的RAM数量。

如果您想查看内存内容,请尝试SysInternals RAMMap。在不同的情况下重复转储创建,例如在复制文件或做大量计算时。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25931385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档