根据任务管理器,我有一个拥有 130MB 内存的进程,根据dotTrace ,只有 11MB 的实时 .NET 对象,所以我想知道其他 120MB 发生了什么?
我需要一个工具来列出进程中加载的程序集和本机 DLL,获取进程中图像的大小,并且对于每个程序集,测量 JITed 方法的内存占用。
来自SysInternal的 ListDlls部分完成了这项工作。但它不测量 JITed 代码大小,它只提供原始数据。理想情况下,我想要一个 UI 来分析和总结这些数据。
最近,Visual Studio 团队报告说使用PerfView工具进行了此类分析。这在博文Visual Studio 11 Beta Performance Part #1部分:The Biggest VM Consumer - DLLs中有说明。有人有使用 PerfView 分析本机 Dll 和程序集足迹的经验和反馈吗?
除了ListDlls和PerfView,你会推荐任何其他工具吗?
好的,Simon Mourier建议的VMMAP似乎是更适合这项任务的工具。VMMAP 显示大部分工作集内存进入托管堆栈(下图中绿色为 113MB),因此问题更多与 .NET 对象相关,而不是非托管内存。绿色锯齿曲线只是装载/卸载会话的时间线。由于某些原因,我的第一个措施是完全错误的:
- dotTrace 告诉我分配了 41MB 的 .NET 对象,
- WMMAP 显示一个 180MB 的工作集(任务管理器显示类似的数字)
- WMMAP 显示由 GC 分配的 113MB 托管堆。此托管堆内存中有 90MB 在工作集中:
所以我的计划是:
- 确定 GC 为何为 41MB 的 .NET 对象分配 113MB 的托管堆?(这样的数字正常吗?是因为高度碎片化吗?)
- 努力缩小分配的这组 41MB 的 .NET 对象!