.NET性能分析最佳實(shí)踐之:如何找出使用過多內(nèi)存的.NET代碼(基礎(chǔ)篇)

          在.NET應(yīng)用中一個(gè)常常影響性能的因素就是代碼消耗了過多的內(nèi)存。很多的開發(fā)人員在編寫代碼的過程中常常不會(huì)關(guān)注性能,從而使得應(yīng)用程序中到處存在性能瓶頸。很多的時(shí)候,開發(fā)人員關(guān)注的總是代碼的執(zhí)行時(shí)間的長短,而把真正的性能問題丟掉了一邊。在本篇文章中,我們將會(huì)找出代碼中的哪些功能消耗了多少內(nèi)存。

                        

          本篇文章比較簡單,我們會(huì)主要詳細(xì)的介紹CLR Profiler這個(gè)工具。

           

          基礎(chǔ)篇:詳解介紹Profiler的使用

                 大家可以從這里從微軟的站點(diǎn)下載CLR Profiler。一旦下載CLR Profiler之后,我們就可以解壓,然后運(yùn)行Bin文件夾中的“CLRProfiler.exe”。

          首先我們來介紹一下CLR Profiler的功能。

           

                 CLR Profiler確實(shí)是一個(gè)不錯(cuò)的工具,通過使用它,我們可以了解一個(gè).NET應(yīng)用程序到底是如何使用內(nèi)存的,基本上面它的功能可以分為兩類,如圖所示:

           

          20120409210650.png

           

          1. 對(duì)一個(gè).NET應(yīng)用中的內(nèi)存是如何分配的給出一個(gè)完整的描述。所以,我們可以看到每一種類型,方法所占用的內(nèi)存情況。

          2. 它告訴我們一個(gè)方法被調(diào)用了多少次。

           

                 這里需要注意的就是:不要再生產(chǎn)環(huán)境或上面的服務(wù)器站點(diǎn)中運(yùn)行CLR Profiler,因?yàn)樗鼤?huì)嚴(yán)重的影響程序的影響。例如,如果我們的應(yīng)用程序中包含兩個(gè)方法,fun1和fun2,此時(shí)當(dāng)我們運(yùn)行CLR Profiler的時(shí)候,它會(huì)將一些邏輯注入到應(yīng)用程序中,通過下面的一個(gè)圖就可以很清楚的看出這個(gè)問題:

           

          20120409210755.png

           

           

          說了這么多,我們還是來看看,如何使用CLR Profiler。

           

                 首先,在使用CLR Profiler之前,我們要清楚:要使用這個(gè)工具來干嘛?基本上,有兩點(diǎn)理由:查看內(nèi)存的分配與使用的情況;查看方法被調(diào)用次數(shù)。

          啟動(dòng)了CRLProfiler.exe之后,選擇要檢查的程序,如下圖:

           

          20120409210842.png

           

           

          此時(shí),應(yīng)用程序就開始運(yùn)行,我們就可以在Profiler中看到一些信息,例如應(yīng)用程序占用的內(nèi)容,每一代對(duì)象占用的大小等,如下:

           20120409210929.png

           

           

                 其實(shí)上面的那個(gè)應(yīng)用程序非常的簡單,只是作為一個(gè)demo演示而言。上面的程序的功能就是在一個(gè)按鈕的事件中調(diào)用了兩個(gè)方法:UseSimpleStringsUseStringBuilders。這個(gè)兩個(gè)方法都是在拼接字符串(這也是常常被用來做例子的一個(gè)場景),我們分別讓它們拼接1000個(gè)字符串,如下:

           

          20120409211022.png

           

           

          其中UseSimpleStrings如下:

           

          20120409211053.png

           

          UseStringBuilders如下:

           

          20120409211127.png

                 現(xiàn)在,我們可以嘗試著使用Profiler去看看每個(gè)方法使用多少的內(nèi)存。我們?cè)诔绦蛑悬c(diǎn)擊按鈕,好讓Profiler去收集信息。然后,我們?cè)邳c(diǎn)擊Profiler的“histogram”按鈕,此時(shí)我們就可以看到程序中的每一種類型的內(nèi)存占用情況,如下:

           

          20120409211321.png

           

          如果我們想看每一個(gè)方法在運(yùn)行過程中占用的內(nèi)容,可以點(diǎn)擊“Allocation Graph”,如下:

           

          20120409211413.png

           

          通過這個(gè)操作,我們可以看到下面的圖:

           

          20120409211458.png

           

                 乍一看,可能感覺界面非常的混亂,特別是在應(yīng)用程序很大的時(shí)候。為了更加看到我們想看的方法,我們可以通過在界面的中點(diǎn)擊右鍵,點(diǎn)擊“Find Routine”,然后選擇輸入過濾的條件,如下:

           

          20120409211523.png

           

          這樣就可以快速的定位,如下:

           

          20120409211559.png

           

          然后在方法上面雙擊,就進(jìn)一步的展開,查看細(xì)節(jié),如下:

           

          20120409211642.png

           

                 在上圖中,我們只是看到了“UseSimpleStrings”方法的使用內(nèi)存的情況,因?yàn)檫@個(gè)界面顯示的信息比較的粗糙,只是把一些內(nèi)存使用比較多的方法列出來了,我們可以通過點(diǎn)擊“0(everything)”查看所以的方法,此時(shí)看到如下:

           

          20120409211717.png

           

          通過上面的圖,我們一目了然的直到內(nèi)存的使用情況

          posted on 2012-04-18 17:27 SkyDream 閱讀(580) 評(píng)論(0)  編輯  收藏 所屬分類: CLR Profiler

          <2012年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 固镇县| 德令哈市| 星子县| 南城县| 蒙阴县| 普兰县| 临高县| 商河县| 伽师县| 阳山县| 永和县| 芮城县| 陆川县| 土默特右旗| 锡林浩特市| 大竹县| 抚松县| 新宁县| 德令哈市| 海门市| 铜鼓县| 榕江县| 阿克苏市| 石城县| 胶南市| 横峰县| 蓬莱市| 樟树市| 延吉市| 石城县| 巴彦淖尔市| 芜湖县| 霍州市| 海原县| 黄陵县| 莲花县| 论坛| 罗山县| 和龙市| 秦安县| 安阳市|