在.NET开发过程中,性能优化是一个不可忽视的重要环节。ANTS Profiler作为一款简单易用的.NET性能分析工具,能够帮助开发者快速定位代码中的性能瓶颈,优化内存使用,提升应用程序的整体性能。本文将详细介绍如何使用ANTS Profiler来分析.NET应用程序的内存使用情况,包括如何安装、配置、执行内存快照以及如何解读分析结果。
ANTS Profiler是一个专为.NET应用程序设计的分析工具,它能够在短时间内帮助开发者识别代码中的性能瓶颈。通过测量代码行级别的执行时间和方法执行时间,ANTS Profiler能够提供关于应用程序性能和内存使用的深入见解。
ANTS Profiler支持多种类型的.NET应用程序,包括Windows应用程序、ASP.NET Web应用程序、COM+应用程序以及.NET Web服务。无论是使用VB.NET、C#还是C++(托管)编写的应用程序,都可以使用ANTS Profiler进行性能分析。
本节将通过一个示例Windows应用程序ShapePainter.exe,展示如何使用ANTS Profiler进行内存分析。ShapePainter.exe是一个创建并绘制一系列图形对象的应用程序,包括随机矩形、椭圆和三角形。这些图形对象在屏幕上的每一个实例都对应于托管堆上的一个对象。
要开始内存分析,首先需要启动ANTS Profiler并使用“Profiler Project Wizard”来指定要进行的分析类型。选择“Profile memory”以指定想要检查创建了哪些对象以及这些对象的创建位置。点击“Next”按钮继续。
接下来,需要在“Profiler Project Wizard”中指定要分析的.NET应用程序类型。可以选择分析.NET桌面应用程序、ASP.NET Web应用程序或COM+服务器应用程序。ShapePainter.exe是一个.NET桌面应用程序,因此选择这个选项并点击“Next”按钮继续。
在“Profiler Project Wizard”的下一步中,需要指定应用程序的可执行文件。浏览并定位到ShapePainter.exe文件,然后点击“Finish”按钮退出向导。现在,已经准备好开始分析了。
一个ANTS Profiler对话框会弹出,询问是否要开始分析应用程序。点击“Yes”继续。在进行内存分析时,需要拍摄快照以获得有用的分析结果。在分析开始之前,会出现一个对话框,提供有关拍摄应用程序快照的信息。点击“OK”按钮启动应用程序。
当开始分析时,ANTS Profiler会启动应用程序(在本例中是Shape Painter),并使其处于活动状态,以便可以运行应用程序的特定部分进行分析。Shape Painter运行时会在窗口中绘制200个随机形状。屏幕上的每个形状都对应于托管堆上的一个对象。
由于正在进行内存分析,现在需要拍摄快照以获得有用的分析结果。为此,将ANTS Profiler窗口置于前台,然后点击工具栏中的“Take snapshot”按钮:
// 点击"Take snapshot"按钮
这会创建与当前应用程序状态相对应的一组结果。然后再次将Shape Painter窗口置于前台,并继续使用应用程序——点击“Add rectangles”以创建另外10个矩形对象。然后切换到ANTS Profiler窗口并再次点击“Take snapshot”按钮以创建第二组结果。
ANTS Profiler窗口最初显示最后一次快照的“Summary”。“Summary”包含有关应用程序的基本信息,以及“10 Biggest live objects”和“10 Classes with the most live instances”。可以点击“Biggest live objects”列表中的任何链接以导航到特定对象。
“Results”窗口显示捕获的两组结果:
// 切换两组结果
在这种情况下,在“Classes with the most live instances”列表中,应该看到“ShapePainter.RectangleShape”类的对象数量在两次快照之间增加了10个。
如果对每个类中创建的对象数量感兴趣,可以转到“All classes”面板以查看所有类的列表。可以点击“Class name”列,按类名排序,然后滚动到“RectangleShape”类:
// 查看"RectangleShape"对象的总数和总大小
如果对“Summary”中未列出的对象感兴趣,可以转到“All objects”面板以查看网格中的所有对象。在查看“All objects”面板时,可以根据需要对方法进行排序、筛选和分组。可以将“Namespace”列标题拖到网格上方的栏中以按该列进行分组,或者在本例中,点击“Namespace: ShapePainter”栏左侧的+以展开网格并显示ShapePainter对象:
// 展开网格并显示ShapePainter对象
然后可以点击类为“RectangleShape”的对象以选中它。
当在“All objects”或“Summary”面板中点击任何对象时,“Hierarchy”面板会更新以显示对象的详细信息以及它“引用”的对象和“被引用”的对象:
// 查看"RectangleShape"对象的详细信息
这表明“RectangleShape”对象是40字节,并且它被一个“System.Object[]”引用。
当在“All objects”或“Summary”面板中点击任何对象时,“Source code”面板会自动更新以显示创建对象的源代码:
// 查看创建"RectangleShape"对象的源代码
这表明“RectangleShape”对象是由方法“CreateFromRandom()”创建的。
如果对创建对象的调用序列感兴趣,可以转到“Call stack”面板以查看所有被调用的方法列表。在这种情况下,需要点击“All objects”面板中的“Object type”标题,按对象类型排序,然后滚动到找到年龄最小的“RectangleShape”对象。然后选择“RectangleShape”对象并点击“View”菜单中的“Call stack”以显示“Call stack”面板。调用堆栈中的第三行显示了这个形状是在启动Shape Painter应用程序时绘制的:
// 查看创建对象的调用堆栈
在“All objects”面板中滚动到找到年龄最大的“RectangleShape”对象,然后选择“RectangleShape”对象。调用堆栈中的第三行显示了这个形状是在点击“Add Rectangles”工具栏按钮时创建的。
// 下载并开始评估ANTS Profiler