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

本文关键字:本机 所有者 内存 应用程序 识别 | 更新日期: 2023-09-27 18:06:56

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

  • Windows XP TaskManager -内存使用- 96,300K
  • 性能监视器
    • 。NET CLR内存
      • # Bytes of all heap - 34,513,708
      • #总提交字节数- 40,591,360
      • #总预留字节数- 50,319,360

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

有没有办法找出其他46mb的内存,没有分配给CLR是用来做什么?我认为这将是用于将dll加载到进程和本机代码使用的内存的组合。

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

  • 私人
    • 托管堆- 25mb
    • Stack - 16mb(看起来相当大)
    • 私人数据- 13mb(不确定这是什么)
    • 图片- 8mb(主要是。net dll)
    • 页面表- 6mb(看起来相当大)

    谁能建议解释堆栈,私有数据和页表的数字?

    注意:我原来引用的计数器现在显示了一些奇怪的数字。

    • Windows XP TaskManager -内存使用- 43,628K
    • 性能监视器
      • 。NET CLR内存
        • # Bytes of all heap - 20mb
        • #总提交字节数- 23mb
        • #总预留字节数- 50mb

    这表明CLR保留的内存比分配给进程的内存多。显然,这是不可能的,所以任务管理器必须只显示当前已分页的内容。

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

    请注意,总内存使用量之间的差异(我不确定TaskManager显示的是什么数字;Windows工具在使用不同的术语来表示相同的概念方面有不好的历史),并且"#Total reserved bytes"也可能被CLR使用,只是不被托管堆使用(因此CLR的本地分配,加载的dll等也可能在这里考虑)。

    您可能需要检查Sysinternals VMMap以获得更详细的信息