识别C#应用程序使用的本机内存的所有者

时间:2011-08-30 11:38:31

标签: c# windows memory

我正在开发一个C#应用程序,它可以在系统托盘中一直运行。因此,我希望最小化应用程序在空闲时使用的内存量。使用Windows perfmon和Windows任务管理器,我得到了一些空闲内存使用数据。

  • Windows XP TaskManager - 内存使用情况 - 96,300K
  • 性能监视器
    • .NET CLR内存
      • 所有堆中的字节数 - 34,513,708
      • #Total committed Bytes - 40,591,360
      • #Top reserved Bytes - 50,319,360

我认为这些数字意味着我的应用程序已被Windows分配了96MB内存。其中50MB已分配给CLR。 CLR发放了40mb。

有没有办法弄清楚还没有分配给CLR的其他46mb内存用于什么?我假设这将是用于将DLL加载到此本机代码所使用的进程和内存中的内存组合。

编辑:我已下载VMMap并找到以下内容。

  • 私人
    • 总计 - 72mb
    • 管理堆 - 25mb
    • Stack - 16mb(看起来很大)
    • 私人数据 - 13mb(不确定这是什么)
    • 图像 - 8mb(主要是.NET DLL)
    • Page Table - 6mb(看起来非常大)
    • 堆 - 3mb

有人可以建议对Stack,Private Data和Page Table数据进行解释吗?

注意:我最初引用的计数器现在显示了一些奇怪的数据。

  • Windows XP TaskManager - 内存使用情况 - 43,428K
  • 性能监视器
    • .NET CLR内存
      • 所有堆中的字节数 - 20mb
      • #Total committed Bytes - 23mb
      • #Total reserved Bytes - 50mb

这表明CLR保留的内存比分配给进程的内存多。显然这不可能是真的,所以TaskManager必须只显示当前被分页的内容。

1 个答案:

答案 0 :(得分:1)

请注意,总内存使用量之间的差异(我不完全确定TaskManager显示的数字; Windows工具有关于使用不同术语表示相同概念的错误历史记录)和“#Total reserved bytes”也可能是由CLR使用,而不是由托管堆使用(因此CLR的本机分配,加载的DLL等也可以在这里考虑)。

您可能需要结帐Sysinternals VMMap以获取更详细的信息。