用于分析进程中加载​​的本机DLL和程序集的内存占用量的工具?

Pat*_*eam 13 .net memory dll process memory-footprint

根据任务管理器,我有一个持有130MB内存的进程,根据dotTrace只有11MB的实时.NET对象,所以我想知道其他120MB发生了什么?

我需要一个工具来列出进程中加载​​的程序集和本机DLL,获取正在处理的图像的大小,并且对于每个程序集,测量JITed方法的内存占用量.

来自SysInternal的ListDlls部分地完成了这项工作.但它不测量JITed代码大小,它只提供原始数据.理想情况下,我想要一个UI来分析和总结这些数据.

最近,Visual Studio团队报告使用PerfView工具进行了此类分析.这在博客文章Visual Studio 11 Beta性能部分#1部分中说明:最大的VM消费者 - DLL.有人有经验和反馈使用PerfView分析本机Dll和程序集的足迹吗?

除了ListDllsPerfView,你会推荐其他任何工具吗?


好吧,Simon Mourier建议的VMMAP似乎是更适合这项任务的工具.在此输入图像描述VMMAP显示大量工作集内存进入托管堆栈(绿色下面为113MB),因此问题与.NET对象的关系比非托管内存更多.绿色锯齿曲线,只是加载/卸载会话的时间表.出于某些原因,我的第一个措施是错误的:

  • dotTrace告诉我,我分配了41MB的.NET对象,
  • WMMAP显示一个180MB的工作集(任务管理器显示相似的数字)
  • WMMAP显示GC分配的113MB托管堆.这个托管堆内存中有90MB位于工作集中:

所以我的计划是:

  1. 确定GC为41MB .NET对象分配113MB托管堆的原因?(这样的数字是正常的吗?是因为高度碎片?)
  2. 努力缩小这个分配的41MB .NET对象!

Sim*_*ier 5

由于您提到了sysinternals的ListDlls,因此还有另一个名为Process Explorer的工具,它具有大量信息,并且比ListDlls好得多(您要确保您拥有的最新版本也包含很多.NET信息,支持64位和32位进程等)。

对于每个进程,您可以在列中或每个进程中同时查看非托管内存(专用字节等)和托管内存(GC集合,大对象堆等)的视图。

sysinternals的另一个不错的工具是VMMAP。它是一个进程内存分析实用程序,显示了不同类型的虚拟和物理内存类型的细分。

至于您的120Mb问题,您确实想检查注入到您的进程中的所有非托管DLL,它们不是标准Windows安装或标准DLL进程集的一部分。对于如此大的分配,我当然首先要跟踪图形组件,因为众所周知它们分配大块内存(尤其是如果您谈论的图形化的NDepend之类的工具时)。Process Explorer也可以跟踪GDI和USER对象的数量。

关于GDI主题,这里有一个名为GDIView的免费工具,它提供了每个进程分配的GDI对象的详细信息。