分析發行組建中的記憶體使用量(C#、Visual Basic、C++、F#)
記憶體使用量 工具會監視應用程式的記憶體使用量。 您可以使用此工具來研究您在 Visual Studio 中積極開發之案例的即時記憶體效果。 您可以擷取應用程式記憶體狀態的詳細快照集,並比較快照集以找出記憶體問題的根本原因。 .NET、ASP.NET、C++或混合模式 (.NET 和原生) 應用程式支援記憶體使用量工具。
記憶體使用量工具可以在發行或偵錯版本 上執行。 在本文中,我們會示範如何在Visual Studio 中使用 Performance Profiler的記憶體使用量工具,該工具建議用於發行組建。 如需為您的需求選擇最佳記憶體分析工具的資訊,請參閱 選擇記憶體分析工具。
如需此檔的最佳體驗,請從文章頂端的清單選擇您慣用的開發語言或運行時間。
記憶體使用量診斷會話
若要啟動記憶體使用量診斷會話:
在 Visual Studio 中開啟專案。
記憶體使用量工具支援 .NET、ASP.NET、C++或混合模式 (.NET 和原生) 應用程式。
在 [偵錯] 功能表中,將方案組態設定為 [發行],然後選擇 [本機 Windows 除錯工具](或 [本機電腦])作為部署目標。
在選單列上,選取 [[偵錯]>[效能分析工具]。
在 [可用的工具]下,選取 [記憶體使用量],然後選取 [開始]。
監視記憶體使用量
當您啟動診斷會話時,您的應用程式會啟動,而 [診斷工具] 視窗會顯示應用程式記憶體使用量的時間軸圖形。
時間軸圖表會在應用程式執行時顯示記憶體波動。 圖形中的尖峰通常表示某些程式碼正在收集或建立數據,然後在處理完成時捨棄它。 大型尖峰表示您可以優化的區域。 主要考慮是記憶體耗用量增加,而不會傳回。 這可能表示記憶體使用效率不佳,甚至記憶體流失。
擷取應用程式記憶體狀態的快照集
應用程式會使用大量物件,而且您可能想要集中分析一個案例。 或者,您可能會發現需要調查的記憶體問題。 您可以在診斷會話期間擷取快照集,以在特定時刻擷取記憶體使用量。 在記憶體問題出現之前,取得應用程式的基本快照是好的。 您可以在問題首次發生後擷取另一個快照,如果可以重現此情境,則可以擷取其他快照。
若要擷取快照,請在您想要擷取記憶體數據時,選取 [擷取快照]。
關閉診斷會話
若要停止監視會話而不建立報告,只要關閉診斷視窗即可。 若要在完成收集或擷取快照集時產生報表,請選取 [停止收集] 。
如果您無法收集或顯示數據,請參閱 針對分析錯誤進行疑難解答,並修正的問題。
記憶體使用量報告
停止資料收集之後,記憶體使用量 工具會停止應用程式,並顯示 [記憶體使用量] 概觀頁面。
記憶體使用量快照集
快照集 窗格中的數字會顯示每次擷取快照集時記憶體中的物件和位元組,以及快照集與上一個快照集之間的差異。
這些數字是打開新的 Visual Studio 視窗中詳細的 記憶體使用量 報告視圖的連結。 快照詳細報告 顯示一個快照中的類型和實例。 快照差異(diff)報表 分析兩個快照中的類型和實例。
針對 C++,Objects (Diff) 欄位會命名為 Allocations (Diff)。
圖像 | 描述 |
---|---|
擷取快照集時記憶體中的物件總數。 選取此連結可顯示依類型實例計數排序的快照詳細數據報表。 | |
這個快照集與上一個快照中的記憶體物件總數之間的差異。 選取此連結,即可顯示快照差異報表,依類型實例總數的差異排序。 | |
擷取快照集時所用記憶體中的位元組總數。 選取此連結可顯示依類型實例大小總計排序的快照詳細數據報表。 | |
前一個和此快照集中記憶體物件總大小的差異。 正數表示此快照集的記憶體大小大於前一個快照集,負數表示大小較小。 基線 表示該快照是診斷會話中的第一個。 無差異 表示差異為零。 選取此連結可顯示快照差異報表,依類型實例大小總計的差異排序。 |
圖像 | 描述 |
---|---|
擷取快照集時記憶體中的位元組數總數。 選取此連結可顯示依類型實例大小總計排序的快照詳細數據報表。 | |
擷取快照集時記憶體中的物件總數。 選取此連結可顯示依類型實例計數排序的快照詳細數據報表。 | |
此快照集中記憶體物件大小總計與上一個快照集中相比的差異。 正數表示此快照集的記憶體大小大於前一個快照集,負數表示大小較小。 基線 表示快照是診斷會話中的第一個。 無差異 表示差異為零。 選取此連結可顯示快照差異報表,依類型實例大小總計的差異排序。 | |
這個快照集與上一個快照中的記憶體物件總數之間的差異。 選取此連結以顯示快照差異報表。 它會依類型實例總數的差異來排序。 |
管理型報告
在 [記憶體使用量] 摘要表中,選擇 物件 (Diff) 儲存格的目前連結。
頂端窗格會顯示快照中類型的計數和大小,包括類型所參考的所有物件大小(內含大小)。
底部窗格中 [根路徑] 樹狀圖會顯示參照上方窗格所選類型的物件。 .NET 垃圾收集器只有在最後參考該物件的類別已被釋放時,才會回收物件的記憶體。 如需使用根 樹狀結構 路徑的詳細資訊,請參閱 分析根目錄的熱門路徑。
頂端窗格會顯示快照中各類型的數量和大小,包括此類型所參考的所有物件的大小(包括大小)。
底部窗格中 [根路徑] 樹狀結構會顯示參考上方窗格中所選取類型的物件。 .NET 垃圾收集器會在最後一個參考該物件的類型被釋放後,才清除物件的記憶體。
參考類型 樹狀結構圖會顯示上方窗格中所選取類型所持有的參考。
參考型別 樹狀結構會顯示上方窗格中所選取類型所保留的參考。
報表樹狀篩選器
應用程式開發人員不需要許多應用程式類型,即可調查記憶體問題。 快照報告篩選器可以隱藏 Managed Memory 中的大多數這些類型,以及 至根的路徑 樹狀結構。
原生類型報表
在 [診斷工具] 視窗的 [記憶體使用量] 摘要表中,選擇 配置 (Diff) 或 堆積大小 (Diff) 單元格的目前連結。
類型檢視 會顯示快照中類型的數目和大小。
選擇實例圖示 (),以顯示快照中所選類型物件的相關信息。
實例 檢視會顯示所選類型的每個實例。 選取實例會顯示撥打堆疊,這導致在 [分配撥打堆棧] 窗格中建立實例。
在 [檢視模式] 清單中,選擇 [堆棧檢視],以查看所選類型的配置堆棧。
記憶體使用量深入解析
針對受控記憶體,記憶體分析工具還提供多種功能強大的內建自動分析見解。 在 [受控類型] 報告中選取 [Insights] 索引標籤,並顯示適用的自動深入解析,例如 重複字串、疏鬆數位,以及 事件處理程式外泄。
重複字串 區段會顯示在堆積中多次分配的字串清單。 此外,本節會顯示浪費的總記憶體,也就是字串大小的 (實例數目 - 1) 倍。
稀疏陣列 區段顯示主要是零元素的陣列,這在效能和記憶體使用量方面可能效率不高。 記憶體分析工具會自動偵測這些陣列,並向您顯示由於這些零值而浪費了多少記憶體。
Visual Studio 2022 17.9 版 Preview 1 中提供的 事件處理程式流失 區段會顯示某個物件訂閱另一個物件事件時可能發生的記憶體流失。 如果事件的發行者比訂閱者活得久,即使沒有其他參考,訂閱者仍然存在。 這可能會導致記憶體流失,其中未使用的記憶體未正確釋放,導致應用程式在一段時間內使用越來越多的記憶體。
已知某些類型具有可讀取的欄位,以判斷其所持有的原生記憶體大小。 [Insights] 索引卷標會顯示物件圖形中的假原生記憶體節點,這些節點會由其父物件保留,讓 UI 能夠辨識它們並顯示其大小和參考圖表。
變更 (差異) 報告
在 [記憶體使用量概觀] 頁面中,選擇 [快照集] 窗格中的變更連結。
在受管理或原生報表的 比較至 清單中,選擇一個快照。
變更報表會將數據行 (標示為 (Diff)) 新增至基底報表,以顯示基底快照集值與比較快照集之間的差異。 以下是原生類型檢視差異報告的可能樣貌:
頂端視窗顯示快照中類型的計數和大小,包括類型所參考的所有物件的總大小(含括大小)。
相關內容
- Visual Studio 中的 程式代碼剖析
- 初次了解分析工具
- 分析通往根的熱門路徑
- 使用 Visual Studio 中的新記憶體使用工具診斷記憶體問題