根据任务管理器,我有一个进程持有 130MB 内存,根据任务管理器,只有 11MB 的活动 .NET 对象dotTrace http://www.jetbrains.com/profiler/所以我想知道另外 120MB 发生了什么?
我需要一个工具来列出进程中加载的程序集和本机 DLL,获取进程中图像的大小,并针对每个程序集测量 JITed 方法的内存占用量。
ListDlls http://technet.microsoft.com/en-us/sysinternals/bb896656来自 SysInternal 的部分完成了这项工作。但它不测量 JIT 代码大小,仅提供原始数据。理想情况下,我希望有一个用户界面来分析和总结这些数据。
最近,Visual Studio 团队报告称已使用该工具完成了此类分析PerfView http://blogs.msdn.com/b/vancem/archive/2011/12/28/publication-of-the-perfview-performance-analysis-tool.aspx。这在博客文章中有说明Visual Studio 11 Beta 性能第 1 部分 https://devblogs.microsoft.com/visualstudio/visual-studio-11-beta-performance-part-1/, 部分:最大的 VM 消费者 - DLL。有人有使用 PerfView 分析本机 Dll 和程序集占用空间的经验和反馈吗?
Except ListDlls and PerfView,您会推荐其他工具吗?
Ok, VMMAP http://technet.microsoft.com/en-us/sysinternals/dd535533 advised by Simon Mourier seems to be the more suited tool for this task. VMMAP shows that the bulk of working set memory goes into the Managed Stack (113MB in green below), so the problem is more related to .NET objects than unmanaged memory. The green saw tooth curve, is just a timeline of loading/unloading sessions. For some reasons, my first measures were quite wrong:
- dotTrace 告诉我分配了 41MB .NET 对象,
- WMMAP 显示 180MB 的工作集(任务管理器显示类似的数字)
- WMMAP 显示 GC 分配了 113MB 的托管堆。 90MB 的托管堆内存位于工作集中:
所以我的计划是:
- 确定为什么 GC 为 41MB 的 .NET 对象分配 113MB 的托管堆? (这样的数字正常吗?是因为碎片化太严重吗?)
- 努力缩小这组分配的 41MB .NET 对象!
既然你提到了 sysinternals 的 ListDlls,那么还有另一个工具叫做流程浏览器 http://technet.microsoft.com/en-us/sysinternals/bb896653它包含大量信息,并且比 ListDlls 好得多(您需要确保拥有最新版本,该版本还包含大量 .NET 信息,支持 64 位和 32 位进程等)。
对于每个进程,您可以同时查看按列或按进程显示的非托管内存(私有字节等)和托管内存(GC 集合、大对象堆等)。
sysinternals 的另一个很酷的工具是VMMAP http://technet.microsoft.com/en-us/sysinternals/dd535533。它是一个进程内存分析实用程序,显示不同类型的虚拟和物理内存类型的细分。
至于你的 120Mb 问题,你确实想检查注入到你的进程中的所有非托管 DLL,并且它们不是标准 Windows 安装或标准 DLL 进程集的一部分。对于如此大的分配,我当然会首先跟踪图形组件,因为它们以分配大内存块而闻名(特别是如果您谈论诸如 NDepend 之类的工具,is图形)。 Process Explorer 还可以跟踪 GDI 和 USER 对象的数量。
关于 GDI 主题,有一个免费工具,名为GDIView http://www.nirsoft.net/utils/gdi_handles.html此处提供了每个进程分配的 GDI 对象的详细信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)