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

根据任务经理,我有一个拥有130MB内存的进程,根据 dotTrace,只有11MB的活.NET对象,所以我想知道其他的120MB?

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

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

最近,Visual Studio团队报告了使用工具PerfView进行了这样的分析.这在博客文章Visual Studio 11 Beta Performance Part #1,部分:最大的虚拟机消费者 – DLLs中已有说明.有人有使用PerfView分析本机Dll和组件足迹的经验和反馈?

除了ListDlls和PerfView,你会推荐任何其他工具吗?

好的,VMMAP Simon Mourier建议似乎是这个任务更适合的工具. VMMAP显示,大部分工作集内存进入托管堆栈(113MB,绿色以下),因此与非托管内存相比,问题更多地与.NET对象相关.绿色锯齿曲线,只是加载/卸载会议的时间表.由于某些原因,我的第一个措施是错误的:

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

所以我的计划是:

>识别为什么GC为41MB的.NET对象分配113MB的托管堆? (这样的数字是否正常?是因为高碎片吗?)
>工作缩小这41MB集合的.NET对象分配!

由于你提到了sysinternals的ListDlls,所以还有另一个名为 Process Explorer的工具,它有大量的信息,比ListDlls要好得多(你想确保你有最新的版本,也有很多的.NET信息,位和32位进程等).

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

来自sysinternals的另一个很酷的工具是VMMAP.它是一个进程内存分析实用程序,并显示了不同类型的虚拟和物理内存类型的细目.

至于你120Mb的问题,你真的想检查所有未被管理的DLL注入到你的进程中,而不是标准Windows安装或标准DLL进程集的一部分.对于这样大的大小分配,我将首先跟踪图形组件,因为它们特别为分配大块内存而着名(特别是如果您说的是像NDepend这样的图形工具). Process Explorer还可以跟踪GDI和USER对象的数量.

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

相关文章

Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...
Windows文件操作基础代码 Windows下对文件进行操作使用的一段...
Winpcap基础代码 使用Winpcap进行网络数据的截获和发送都需要...
使用vbs脚本进行批量编码转换 最近需要使用SourceInsight查看...