【问题标题】:What accounts for the difference between the size of the heap (as reported by umdh) and the (private) working set (as reported by task manager)?堆大小(由 umdh 报告)和(私有)工作集(由任务管理器报告)之间的差异是什么原因造成的?
【发布时间】:2011-08-27 22:58:41
【问题描述】:

在 Windows 7.VS2008 上运行的 C++ 本机代码。

我的应用程序的特定状态更改将工作集(私有工作集)从 16Mb(6.5Mb) 增加到 38Mb(22Mb)。由于这似乎过度,我使用 umdh 检查了堆更改。我发现增加了 ~9Mb 之前和之后的堆之间的差异。

工作集中额外内存的原因是什么?

我怀疑它可能是 dll 加载,但我如何确认并分解它?

【问题讨论】:

  • Windows 以页为单位进行内存统计;即 38 MB 实际上是 9500 页。堆使用是否表示相同,即 2250 页?还是请求分配大小的总和?
  • 它是请求分配大小的字节总和。 umdh 报告“总增加 == 5601391 请求 + 3685785 开销 = 9287176”
  • 私有工作集是堆的大小加上栈的大小。你是否产生了任何额外的线程?
  • 是的,应用程序中有多个线程。我知道每个线程都分配了一个 1 mb 的堆栈,但我认为实际上它是一个 4 kb 的堆栈,并带有允许它增长的标记,即生成一个新线程不会添加完整的 1 mb。

标签: c++ memory-management heap-memory working-set umdh


【解决方案1】:

当应用程序请求内存时,windows 给它的内存比它所要求的要多,因此来自所有应用程序的后续请求不会导致过多的碎片。例如,您一次请求 1 个字节,您的工作集不会一次增长 1 个字节或一次按页增长,但可能一次增长兆字节。工作集是物理内存中的页面。如果有其他需要,窗户也可以带走多余的东西。

【讨论】:

  • 我认为这是 umdh 报告的堆分配开销。我在问 9mb 堆(包括 ~4mb 的开销)和工作集增加 22mb 之间的区别是什么。
猜你喜欢
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
相关资源
最近更新 更多