为什么create-dump-file操作会极大地增加工作集(内存)的大小?

时间:2014-09-19 10:06:35

标签: memory windbg dump

我使用C#

编写了一个Hello-world控制台应用程序
class Program
{
  static void Main(string[] args)
  {
    Console.WriteLine("Hello World");

    Console.Read();
  }
}

,当我启动它时,它所采用的内存是: enter image description here

然后,我尝试创建此进程的转储文件: enter image description here

创建转储后,此过程占用的内存为: enter image description here

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

有关此内存增量的其他有趣内容是:

  1. 我的进程内存工作集增加到46 MB后,似乎不再减少到7 MB。
  2. 转储文件的大小不是7MB,而是46 MB。
  3. 私人工作集从1.83MB增加到2.29MB
  4. 而且,这是我的问题:

    1.为什么内存增量与创建转储操作一起?

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

    3.我对46MB转储文件中的内容非常好奇(换句话说,我对目前的hello world应用程序占用46 MB内存的原因感到非常好奇)。我熟悉SOS命令,比如!DumpHeap或!eeheap,但这些命令不足以告诉46MB大小文件中的所有内容。任何人都可以分享一些有用的工具,链接或说明吗?

    非常感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

在95%的案例中(或者更多,我没有关于它的统计数据),您无需担心工作集。微软选择Working Set列作为任务管理器的默认列是相当误导的。

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

  1. 保留内存,既不存在于RAM中也不存在于磁盘上
  2. 已提交的内存,当前不需要,因此写入磁盘
  3. 已提交的内存,当前需要,因此可在RAM中供CPU访问。这称为工作集。
  4. Windows减少或增加工作集的原因有很多。在许多情况下,原因可以在除您之外的其他应用程序中找到。但是,在您描述的情况下,很明显:

    1. 调试器暂停进程
    2. 调试器创建一个新线程并触发MiniDumpWriteDump函数
    3. 该函数需要读取所有已提交的内存才能将其写入转储
    4. 访问虚拟内存时,内存中已被分页到磁盘的那些部分需要被分页回RAM。
    5. 如前所述,RAM中的虚拟内存称为工作集,因此工作集增加
    6. 但是,它仍然取决于您在创建转储时使用PC执行的其他操作。尝试运行多线程应用程序,在转储进程时大量使用内存。您可能会发现Windows考虑到这种情况,并且在内存中进行分页之前,它会将您自己进程的内存分页。在这种情况下,工作集不会像屏幕截图那样增加。

      所以,再次:不要担心工作集。 Windows只是认为它有足够的RAM来加速转储创建过程。它可能使用了原本未使用的内存或减少了用于磁盘缓存的RAM量。

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