识别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
- 。NET CLR内存
我认为这些数字意味着我的应用程序已经被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
- 。NET CLR内存
这表明CLR保留的内存比分配给进程的内存多。显然,这是不可能的,所以任务管理器必须只显示当前已分页的内容。
请注意,总内存使用量之间的差异(我不确定TaskManager显示的是什么数字;Windows工具在使用不同的术语来表示相同的概念方面有不好的历史),并且"#Total reserved bytes"也可能被CLR使用,只是不被托管堆使用(因此CLR的本地分配,加载的dll等也可能在这里考虑)。
您可能需要检查Sysinternals VMMap以获得更详细的信息