.NET性能分析最佳实践之:如何找出使用过多内存的.NET代码(基础篇)
在.NET应用中一个经常影响性能的因素就是代码消耗了过多的内存。不少的开发人员在编写代码的过程当中经常不会关注性能,从而使得应用程序中处处存在性能瓶颈。不少的时候,开发人员关注的老是代码的执行时间的长短,而把真正的性能问题丢掉了一边。在本篇文章中,咱们将会找出代码中的哪些功能消耗了多少内存。
本篇文章比较简单,咱们会主要详细的介绍CLR Profiler这个工具。
系列文章:
本篇议题以下:
基础篇:详解介绍Profiler的使用
进阶篇:调用Profiler的API进行
基础篇:详解介绍Profiler的使用
你们能够从这里从微软的站点下载CLR Profiler。一旦下载CLR Profiler以后,咱们就能够解压,而后运行Bin文件夹中的“CLRProfiler.exe”。
首先咱们来介绍一下CLR Profiler的功能。
CLR Profiler确实是一个不错的工具,经过使用它,咱们能够了解一个.NET应用程序究竟是如何使用内存的,基本上面它的功能能够分为两类,如图所示:
1. 对一个.NET应用中的内存是如何分配的给出一个完整的描述。因此,咱们能够看到每一种类型,方法所占用的内存状况。
2. 它告诉咱们一个方法被调用了多少次。
这里须要注意的就是:不要再生产环境或上面的服务器站点中运行CLR Profiler,由于它会严重的影响程序的影响。例如,若是咱们的应用程序中包含两个方法,fun1和fun2,此时当咱们运行CLR Profiler的时候,它会将一些逻辑注入到应用程序中,经过下面的一个图就能够很清楚的看出这个问题:
说了这么多,咱们仍是来看看,如何使用CLR Profiler。
首先,在使用CLR Profiler以前,咱们要清楚:要使用这个工具来干吗?基本上,有两点理由:查看内存的分配与使用的状况;查看方法被调用次数。
启动了CRLProfiler.exe以后,选择要检查的程序,以下图:
此时,应用程序就开始运行,咱们就能够在Profiler中看到一些信息,例如应用程序占用的内容,每一代对象占用的大小等,以下:
其实上面的那个应用程序很是的简单,只是做为一个demo演示而言。上面的程序的功能就是在一个按钮的事件中调用了两个方法:UseSimpleStrings和UseStringBuilders。这个两个方法都是在拼接字符串(这也是经常被用来作例子的一个场景),咱们分别让它们拼接1000个字符串,以下:
其中UseSimpleStrings以下:
UseStringBuilders以下:
如今,咱们能够尝试着使用Profiler去看看每一个方法使用多少的内存。咱们在程序中点击按钮,好让Profiler去收集信息。而后,咱们在点击Profiler的“histogram”按钮,此时咱们就能够看到程序中的每一种类型的内存占用状况,以下:
若是咱们想看每个方法在运行过程当中占用的内容,能够点击“Allocation Graph”,以下:
经过这个操做,咱们能够看到下面的图:
乍一看,可能感受界面很是的混乱,特别是在应用程序很大的时候。为了更加看到咱们想看的方法,咱们能够经过在界面的中点击右键,点击“Find Routine”,而后选择输入过滤的条件,以下:
这样就能够快速的定位,以下:
而后在方法上面双击,就进一步的展开,查看细节,以下:
在上图中,咱们只是看到了“UseSimpleStrings”方法的使用内存的状况,由于这个界面显示的信息比较的粗糙,只是把一些内存使用比较多的方法列出来了,咱们能够经过点击“0(everything)”查看因此的方法,此时看到以下:
经过上面的图,咱们一目了然的直到内存的使用状况。