.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)」查看因此的方法,此時看到以下:
經過上面的圖,咱們一目瞭然的直到內存的使用狀況。