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和程序集的足迹吗?
除了ListDlls和PerfView,你会推荐其他任何工具吗?
好吧,Simon Mourier建议的VMMAP似乎是更适合这项任务的工具.
VMMAP显示大量工作集内存进入托管堆栈(绿色下面为113MB),因此问题与.NET对象的关系比非托管内存更多.绿色锯齿曲线,只是加载/卸载会话的时间表.出于某些原因,我的第一个措施是错误的:
所以我的计划是:
由于您提到了sysinternals的ListDlls,因此还有另一个名为Process Explorer的工具,它具有大量信息,并且比ListDlls好得多(您要确保您拥有的最新版本也包含很多.NET信息,支持64位和32位进程等)。
对于每个进程,您可以在列中或每个进程中同时查看非托管内存(专用字节等)和托管内存(GC集合,大对象堆等)的视图。
sysinternals的另一个不错的工具是VMMAP。它是一个进程内存分析实用程序,显示了不同类型的虚拟和物理内存类型的细分。
至于您的120Mb问题,您确实想检查注入到您的进程中的所有非托管DLL,它们不是标准Windows安装或标准DLL进程集的一部分。对于如此大的分配,我当然首先要跟踪图形组件,因为众所周知它们分配大块内存(尤其是如果您谈论的是图形化的NDepend之类的工具时)。Process Explorer也可以跟踪GDI和USER对象的数量。
关于GDI主题,这里有一个名为GDIView的免费工具,它提供了每个进程分配的GDI对象的详细信息。