.NET Memory Profiler
.NET Memory Profiler是一个功能强大的软件,用于查找内存泄漏并优化用C#, VB.NET或任何其他.NET语言编写的程序中的内存使用情况。在分析指南、自动内存分析器和专用跟踪器的帮助下,您可以确保您的程序没有内存或资源泄漏,并且内存使用尽可能优化。
查找内存泄漏
即使.NET运行时有垃圾收集器,内存泄漏仍然是一个现实。当不再需要的实例仍然可以从根路径(例如静态字段)访问时,就会发生内存泄漏。
通过使用.NET Memory Profiler,您可以在任务管理器中发现内存泄漏并在它们产生内存不足错误之前检测到它们。即使是很小的内存泄漏也会导致长时间运行的程序出现问题。
.NET Memory Profiler将:
引导您完成检测内存泄漏的过程
一个交互式的评测指南将逐步指导您如何检测内存泄漏。
通过收集和比较快照帮助您识别内存泄漏
可以在执行用户操作(例如打开和关闭文档)之前和之后收集内存使用情况的快照。将通过比较创建的新实例提供有关操作的信息。然后,您可以进一步调查新实例,以确定它们是否属于内存泄漏的一部分。
自动分析内存使用情况并突出显示潜在的内存泄漏问题
自动内存分析器将帮助您定位潜在的内存泄漏,例如遗留的事件处理程序。
显示潜在内存泄漏的新实例的根路径
根路径会告诉您实例没有被垃圾收集的原因。这是找出内存泄漏是如何发生的最重要的信息。
提供有关如何创建实例的信息
要理解一个实例为什么会意外地保持活动状态,关键是要知道它是如何创建的,以及根路径中的其他实例是如何创建的。.NET Memory Profiler将显示快照中每个实例的分配调用堆栈。
可视化实例的使用方式
实例图将为您提供一个完整的图片,它是如何使用一个可疑的内存泄漏实例的,它是如何与其他实例相关的,也许最重要的是,根路径是如何阻止它被垃圾回收的。
减少资源使用
本机资源,如Win32堆内存、窗口句柄和文件句柄,也用于托管的.NET程序中。即使应用程序可能不直接使用它们,但是.NET运行时、Windows和本机库也可以间接使用它们。
通过使用.NET Memory Profiler,您可以确保本机资源尽可能快地释放,并且不存在资源泄漏。
.NET Memory Profiler将:
帮助您确保正确释放所有实例
处理跟踪程序将为您提供有关未正确释放的一次性实例的信息。一次性实例通常包装本机资源。未能释放实例可能会延迟本机资源的释放,甚至导致资源泄漏。
提供有关资源分配和所有资源实例的实时信息
非托管资源跟踪器将收集有关所有本机资源和分配的信息。这些信息以实时视图的形式显示,使您能够很好地了解程序的资源使用情况。
通过收集和比较快照帮助您识别资源泄漏
启用资源跟踪器后,快照包括有关资源实例和分配的信息。通过比较快照,您可以更容易地检测资源泄漏(类似于检测托管内存泄漏的方式)。
让您的程序运行得更快
如果您的程序使用了太多内存,执行了太多的分配,或者具有错误的分配模式,那么性能将受到影响。这不仅会影响您的程序,还会影响其他程序。使用.NET Memory Profiler,您将获得所需的信息,以确保程序的内存使用尽可能高效。
.NET Memory Profiler将:
帮助您优化内存和资源使用
堆利用率跟踪程序将告诉您如何使用托管堆,并指示错误的分配模式。处理跟踪程序将帮助您确保一次性实例被正确释放。这些信息可以帮助您优化应用程序的内存和资源使用。
提供有关应用程序内存使用峰值的信息
通过使用新的峰值快照集合,您可以获得有关应用程序的峰值托管内存使用率的详细信息。
检测重复实例
.NET Memory Profiler中的自动内存分析器将为您提供有关所有重复实例的详细信息。这包括简单的重复项(如重复的字符串)和复杂的重复项(如大型相同的哈希表)。此信息将帮助您避免由于重复而导致的不必要的内存使用。
显示实时内存和资源信息
探查器提供有关在垃圾收集堆上执行的所有.NET实例分配以及驻留在堆上的所有实例的实时信息。
帮助您确保正确释放所有实例
处理跟踪程序将为您提供有关未正确释放的一次性实例的信息。一次性实例通常具有终结器和包装本机资源。未能释放实例可能会导致代价高昂的终结并延迟本机资源的释放。
研究生产代码中的内存问题
.NET Memory Profiler在从探查器启动分析应用程序时提供最详细的信息。但是,在对生产应用程序中的内存问题进行故障排除时,例如当问题发生在客户的计算机上且无法轻松再现时,这并非总是可能的。
使用.NET Memory Profiler,您可以:
附加到正在运行的进程
当您由于任何原因无法从探查器启动已分析的应用程序时,您仍然可以附加到正在运行的进程并获取详细的内存使用信息。
在未安装.NET Memory Profiler的计算机上收集内存信息
NmpCore是一个独立的工具,用于在未安装.NET Memory Profiler的计算机上收集快照和创建会话文件。
它不需要安装,可以很容易地从远程站点检索内存数据。
在远程计算机上分析进程
远程分析允许您使用开发计算机来分析在不希望或无法安装完整探查器的计算机上运行的进程。NmpCore在远程计算机上用于提供对计算机的远程分析访问。
导入内存转储文件
有时您只有一个内存转储文件。使用.NET Memory Profiler导入它,您可以轻松地获得进程内存使用情况的直观概述。
使用.NET Memory Profiler自动化内存测试
通过使用.NET Memory Profiler自动化内存测试,可以确保应用程序中没有任何内存泄漏。
使用.NET Memory Profiler,您可以:
自动检测内存泄漏
.NET Memory Profiler API可以自动检测内存泄漏,并从已分析的程序中控制探查器。
使用方法属性声明预期的内存使用情况
在您的方法中添加属性以定义预期的内存使用量。分析应用程序时,探查器将验证预期的行为,并在验证失败时通知您。
在单元测试中包括内存说明
通过使用单元测试框架(如NUnit、MSTest或XUnit)并使用NmpCore工具或MsBuild NmpCore任务运行探查器,测试可以完全自动化。
在探查器下运行单元测试
通过在Visual Studio中使用“在探查器下运行单元测试”命令,或者使用CodeRush测试运行器,您可以轻松地在探查器下运行单元测试。
使用.NET Memory Profiler改善Visual Studio调试体验
直接从Visual Studio启动调试,并从Visual Studio直接启动调试信息。.NET Memory Profiler与Visual Studio完全集成,因此您永远不必离开开发环境。
使用.NET Memory Profiler Visual Studio集成,您可以:
轻松开始分析您的Visual Studio项目
只需选择“启动内存分析器”命令,.NET Memory Profiler将构建您的项目并开始分析。查看实时内存使用情况,收集快照并在源代码和内存使用信息之间快速切换。
如果启动项目是Azure项目,探查器将开始分析Azure计算仿真器及其相关进程。
改善调试体验
您可以同时调试和分析内存使用情况。可以在断点处停止时收集快照。从监视窗口使用探查器可视化工具,可以访问您可能需要的有关实例的所有信息,例如完整实例图和分配调用堆栈。
在探查器下运行单元测试
通过在Visual Studio中使用“在探查器下运行单元测试”命令,现在可以轻松地在探查器下运行单元测试。
.NET Memory Profiler 5.7的新增功能?
.NET Memory Profiler 5.7的主要新功能包括:
改进了对.NET Core 3.x和.NET 5.0的支持
这包括一个新的调试符号读取器,它支持便携式PDBs、委托目标方法标识和WPF分析支持。
调试评测的新实现
新的实现使用了Visual Studio 2015和更高版本中提供的调试器API,并且不再依赖可能导致问题的未记录行为(5.7版中已放弃对Visual Studio 2012和2013的支持)。
以前的实现在Visual Studio进程中运行,仅限于调试32位进程。
以前的实现要求在启用调试和分析的情况下启动进程。现在,可以将调试器附加到已分析的进程,也可以将探查器附加到已调试的进程。
单元测试评测的新实现
新实现基于新的单元测试数据采集器(NmpDataCollector),支持最新版本的Visual Studio 2019和Visual Studio 2019预览版以及Visual Studio 2017(此功能在Visual Studio 2015中未实现)。
使用新的调试分析实现,现在还可以调试在分析器下运行的单元测试。
注意!即使单元测试评测基于NmpDataCollector,也不需要安装NmpDataCollector包来在Visual Studio中的探查器下运行单元测试。
VSTest的单元测试数据采集器
NmpDataCollector是可以添加到单元测试项目中的VSTest数据收集器。它以NuGet包的形式提供,使得在构建过程中在探查器下运行单元测试非常容易,例如CI/CD管道。
混合检查快照
通常,探查器将尝试允许运行时在收集快照之前对尽可能多的实例进行垃圾收集。这大大降低了错误地将实例标识为内存泄漏的风险。但是,在调查和优化内存利用率(例如使用堆利用率跟踪器)时,能很好地获取快照时实际内存使用情况的信息。
新的检查快照将按原样收集内存使用情况信息,包括无法访问的实例。这与执行检查分析时收集的快照类型相同,但包含标准快照可用的所有附加信息,例如分配调用堆栈。
代理目标方法的识别
当用户分析在.NET Core 3.0或更高版本下运行的进程时,配置文件将标识委托的目标方法。这样可以更容易地确定创建委托或未删除委托的原因。这在分配调用堆栈信息不可用时尤其重要,例如在附加或调查内存转储文件时。
.NETCore3.x和.NET5.0中的WPF清理支持
作为探查器在收集快照之前尝试执行的内存清理的一部分,它触发WPF中过时数据绑定的清理。这是在.NET Memory Profiler 5.5中实现的,但在分析运行在.NET Core 3.0或更高版本下的WPF应用程序时会出现问题。现在.NETCore3.x和.NET5.0完全支持WPF清理。
固定堆中实例的标识
.NET5引入了一个新的托管堆,固定堆,它将在其中放置分配为“固定”的实例(使用GC.AllocateArray或者GC.AllocateUninitializedArray). .NET Memory Profiler将使用分析问题和本机内存视图来标识放置在此堆中的实例。
.NET Memory Profiler功能介绍
在这个页面上,您可以找到使用.NET Memory Profiler可以执行的操作的摘要。
标准配置文件
使用向导,您可以轻松地开始分析以下类型的进程:
生产代码分析
还提供了一个向导,用于将探查器连接到已运行的进程,或导入内存转储文件。这在分析生产应用程序中的问题时特别有用。
使用.NET runtime 4.0及更高版本提供的“附加到”API来更快、更安全地收集快照。
使用NmpCore工具在未安装.NET内存探查器的计算机上收集内存快照。
远程分析
远程分析允许您使用开发计算机来分析在不希望或无法安装完整探查器的计算机上运行的进程。NmpCore工具在远程计算机上用于提供对计算机的远程分析访问。
分析级别
分析级别允许您选择要从已分析的应用程序收集的信息量。介质分析在收集的数据量和探查器的性能影响之间提供了很好的平衡。当您分析一个非常复杂和占用内存的应用程序时,低级别或非常低级别可能更合适,因为内存和性能开销要低得多。要获取完整的内存信息,包括堆利用率,请使用高级别。
导向仿形
探查器指南提供了交互式分步说明,可帮助您执行常见的内存分析任务,如内存泄漏调查。
更新!快照收集
收集快照允许显示有关垃圾收集堆的详细信息。如果启用了非托管资源跟踪,则还会显示有关非托管资源的详细信息。
新的!混合检查快照提供内存使用情况的视图,包括无法访问的实例。
快照比较
比较快照可以显示堆数据更改的相关信息。例如,可以使用此信息查找本应收集的实例来查找内存泄漏。如果启用了非托管资源跟踪,则还会显示有关非托管资源实例的更改信息。
快照筛选器
快照筛选器允许您在快照比较中深入查看实例和分配的子集。
自动内存分析器
不知道分析内存快照时从何处开始?使用自动内存分析,您将获得有关常见内存使用问题的提示和警告。这将帮助您定位潜在的内存泄漏并优化内存和资源的使用。
内存分析器可识别30多个内存问题,从有关可能内存泄漏的警告到有关内存如何使用的信息(例如ASP.NET缓存)。
更新!Visual Studio 2015、Visual Studio 2017和Visual Studio 2019集成
Visual Studio集成允许您开始分析C和Visual基本.NET开发环境中的项目,以及打开以前存储的会话文件。
.NET Memory Profiler作为单独的进程运行,即使是从Visual Studio进行分析时也是如此。这使探查器能够处理更大的会话,并分析内存使用率更高的进程。它还提供了Visual Studio和Profiler之间更好的隔离、更好的性能以及减少与第三方组件的冲突。
上面的屏幕截图显示了一个大于8GB的文件的内存转储导入。导入后,.NET Memory Profiler将消耗接近7GB的内存,这在Visual Studio进程中是不可能的。
更新!调试配置文件
使用调试分析,您可以同时启动调试器和探查器,并在监视窗口(监视、局部变量、自动和调试器工具提示)中获得探查器集成,并且可以在断点处停止时收集快照。您可以在Visual Studio中使用命令Profiler->Debug with Memory Profiler启动调试分析。
更新!在探查器下运行测试
通过使用“在探查器下运行单元测试”命令,您可以在探查器下运行单元测试。
使用CodeRush测试运行程序在分析器下运行测试(由DevExpress提供)
如果DevExpress CodeRush安装在Visual Studio中,则可以使用CodeRush测试运行程序在内存探查器下运行单元测试。这比使用“在内存探查器下运行测试”命令更方便和直观。
重复实例检测
.NET Memory Profiler中的自动内存分析器还将提供有关所有重复实例的详细信息。这包括简单的重复项(如重复的字符串)和复杂的重复项(如大型相同的哈希表)。此信息将帮助您避免由于重复而导致的不必要的内存使用。
实例和分配筛选器
使用筛选器,您可以获取有关共享公共特征的实例和分配的信息,例如,从特定类型派生的所有分配和实例、由根直接引用的所有实例或由特定方法执行的所有分配。通过组合过滤器,您可以获得非常特殊的信息,例如由根直接引用并由特定程序集中的方法分配的特定类型的所有实例。
峰值快照收集
峰值快照可用于获取有关应用程序内存使用峰值的详细信息。峰值快照包括垃圾收集之前的实例和字节总数、收集的实例和字节数以及无法访问但仍存在于GC堆中的实例和字节数等信息。
依赖属性评估
分析WPF或Silverlight应用程序时,探查器将评估依赖关系属性。属性将在类型实例详细信息页下的“引用者”、“引用”、“字段值”和“实例图”等视图中显示为“伪字段”。
所有实例分配的调用堆栈信息
每次分配托管实例或非托管资源实例时,都会存储分配调用堆栈。这提供了关于创建实例的原因和方式的非常有用的信息。
通过自动跳过调用堆栈中不太重要的帧,可以使用调用堆栈减少内存使用并提高性能。
完整的本机调用堆栈是使用快速的本机堆栈遍历器收集的。这将使您更好地理解应用程序如何使用本机内存和资源。
如果DevExpress CodeRush安装在Visual Studio中,CodeRush中的反编译器功能将用于反编译所呈现的调用堆栈中的方法。
更新!类型、资源和筛选器详细信息
Type/Resource/Filter Details视图是堆快照视图之一。它显示所选类型或资源的详细信息,包括:
此信息包括实例数、实例大小、保留字节数以及内存分析器发现的任何问题。对于一次性类型,它还包括有关已释放实例和未处置实例数量的信息。
最短根路径是基于类型而不是实例来组合的,这使得分析具有大量活动实例的类型更加容易。
组合实例图显示所选实例的根路径、具有特定最短根路径的实例或共享公共分配调用堆栈的实例。
更新!实例详细信息
实例详细信息是堆快照视图之一。它显示选定实例的详细信息,其中包括:
对于托管类型实例,此信息包括实例使用和持有的字节数、期限和状态(如“新建”、“已释放”)以及内存分析器发现的任何问题。对于非托管资源实例,此信息包括标识符、大小和状态。
对于托管类型实例,将显示以下附加信息:
对于非托管资源实例,将显示以下附加信息:
更新!实例图
实例图为您提供了一个直观的概述,它是如何被使用的,它是如何与其他实例相关的,也许最重要的是,根路径如何阻止它被垃圾收集。
调用堆栈和方法
调用堆栈/方法是堆快照视图之一。它显示所有调用堆栈和已执行分配的方法的信息。
本机内存
本机内存信息(即,由操作系统而不是公共语言运行库管理的内存)可用于选定的堆快照、已分析的进程以及计算机上运行的任何其他进程。
处理跟踪程序
处理跟踪程序用于标识未正确释放的实例。它还可以通过已被释放但未被垃圾收集的定位实例来识别内存泄漏。
分析同一会话中的多个进程
在.NET Memory Profiler的企业版中,探查器可以评测由所分析的进程创建的所有子进程。这简化了使用.NET实现的启动程序进程启动的进程的分析。也可以在同一分析会话中分析Visual Studio解决方案中的所有启动项目。
配置多个运行时
如果将.NET运行时的多个版本加载到分析的进程中,则主窗口中会出现一个运行时选择器。
使用这个选择器,您可以选择应该为哪个运行时显示信息,或者是否应该为所有运行时显示信息。
专注于单个运行时或AppDomain
运行时和AppDomain跟踪程序允许您调查特定运行时或AppDomain中的内存使用情况。这在分析时特别有用ASP.NET在不同的应用程序域中运行的应用程序。
更新!实时数据采集
可以收集和显示GC堆上活动的实时数据。此信息很好地概述了在分析进程的生命周期内内存的使用情况。实时信息包括全局统计信息,如实例总数、执行的GCs数量等,还包括所分析过程中每种类型的实时信息。信息以数字和图形的形式呈现。
如果启用了非托管资源跟踪,则有关非托管资源实例的信息也将包含在数字和图形实时视图中。
还可以将性能计数器添加到实时图形中。性能计数器可以与分析的进程相关联,也可以是系统上可用的任何其他性能计数器。
可以将外部会话添加到实时图中,以便比较从多个会话收集的数据。
探查器项目
.NET Memory Profiler项目可用于保存有关如何对进程进行探查的所有设置,从而更容易为不同的应用程序使用不同的设置。
.NET Memory Profiler项目还用于跟踪与项目相关的会话文件。探查器项目资源管理器显示所有加载的项目及其会话文件,并允许您比较不同会话之间的快照。这在执行自动化测试时特别有用,您需要检查程序的不同版本之间的内存使用情况是否发生了变化。
堆利用率跟踪程序
堆利用率跟踪程序可用于分析和优化垃圾收集堆的使用方式。
GC句柄标识
GC句柄用于创建托管实例的句柄。.NET Memory Profiler跟踪运行时本身或使用WeakReference和GCHandle类型创建的内部GC句柄。
收集到的GC句柄信息在堆快照视图中显示为<GCHandle>伪类型。
更新!使用.NET Memory Profiler API进行自动测试
.NET Memory Profiler API可用于在分析进程中控制探查器,并使用断言检测潜在的内存泄漏。这个API非常适合于自动测试内存使用错误,例如使用NUnit或MSTest之类的单元测试框架。
新的!NMP数据采集器
NMP数据采集器简化了单元测试的分析。
MSBuild NmpCore任务
NmpCore工具可作为MSBuild任务使用。这使得在构建期间(例如,使用连续集成时)使用NmpCore进行自动内存测试变得更加容易。
命令行分析
可以向探查器提供命令行参数。与.NET Memory Profiler API一起使用,可以在自动化测试环境中使用探查器,而无需任何用户交互。
支持.NET Framework 2.0、3.0、3.5、4.0、4.5、4.6、4.7和4.8
更新!支持.NET Core 1.x、2.x和3.x
新的!支持.NET 5.0
.NET Memory Profiler可用于评测在.NET Framework和.NET Core的所有版本下运行的进程,但.NET Framework 1.x除外。