共用方式為


分析發行組建中的記憶體使用量(C#、Visual Basic、C++、F#)

記憶體使用量 工具會監視應用程式的記憶體使用量。 您可以使用此工具來研究您在 Visual Studio 中積極開發之案例的即時記憶體效果。 您可以擷取應用程式記憶體狀態的詳細快照集,並比較快照集以找出記憶體問題的根本原因。 .NET、ASP.NET、C++或混合模式 (.NET 和原生) 應用程式支援記憶體使用量工具。

記憶體使用量工具可以在發行或偵錯版本 上執行。 在本文中,我們會示範如何在Visual Studio 中使用 Performance Profiler的記憶體使用量工具,該工具建議用於發行組建。 如需為您的需求選擇最佳記憶體分析工具的資訊,請參閱 選擇記憶體分析工具

如需此檔的最佳體驗,請從文章頂端的清單選擇您慣用的開發語言或運行時間。

記憶體使用量診斷會話

若要啟動記憶體使用量診斷會話:

  1. 在 Visual Studio 中開啟專案。

    記憶體使用量工具支援 .NET、ASP.NET、C++或混合模式 (.NET 和原生) 應用程式。

  2. 在 [偵錯] 功能表中,將方案組態設定為 [發行],然後選擇 [本機 Windows 除錯工具](或 [本機電腦])作為部署目標。

  3. 在選單列上,選取 [[偵錯]>[效能分析工具]

  4. 在 [可用的工具]下,選取 [記憶體使用量],然後選取 [開始]。

    啟動記憶體使用量診斷會話。

監視記憶體使用量

當您啟動診斷會話時,您的應用程式會啟動,而 [診斷工具] 視窗會顯示應用程式記憶體使用量的時間軸圖形。

Visual Studio 效能分析工具視窗中 [診斷工具] 視窗的螢幕快照,其中顯示應用程式記憶體使用量的時間軸圖表。

時間軸圖表會在應用程式執行時顯示記憶體波動。 圖形中的尖峰通常表示某些程式碼正在收集或建立數據,然後在處理完成時捨棄它。 大型尖峰表示您可以優化的區域。 主要考慮是記憶體耗用量增加,而不會傳回。 這可能表示記憶體使用效率不佳,甚至記憶體流失。

擷取應用程式記憶體狀態的快照集

應用程式會使用大量物件,而且您可能想要集中分析一個案例。 或者,您可能會發現需要調查的記憶體問題。 您可以在診斷會話期間擷取快照集,以在特定時刻擷取記憶體使用量。 在記憶體問題出現之前,取得應用程式的基本快照是好的。 您可以在問題首次發生後擷取另一個快照,如果可以重現此情境,則可以擷取其他快照。

若要擷取快照,請在您想要擷取記憶體數據時,選取 [擷取快照]。

擷取快照的螢幕截圖。

關閉診斷會話

若要停止監視會話而不建立報告,只要關閉診斷視窗即可。 若要在完成收集或擷取快照集時產生報表,請選取 [停止收集]

停止收集的螢幕快照。

停止收集過程的螢幕快照。

如果您無法收集或顯示數據,請參閱 針對分析錯誤進行疑難解答,並修正的問題。

記憶體使用量報告

停止資料收集之後,記憶體使用量 工具會停止應用程式,並顯示 [記憶體使用量] 概觀頁面。

Visual Studio 效能分析工具 [記憶體使用量] 工具中 [概觀] 頁面的螢幕快照,其中顯示記憶體使用量圖表和兩個快照集窗格。

Visual Studio 效能分析工具 [記憶體使用量] 工具中 [概觀] 頁面的螢幕快照,其中顯示記憶體使用量圖表和兩個快照集窗格。

記憶體使用量快照集

快照集 窗格中的數字會顯示每次擷取快照集時記憶體中的物件和位元組,以及快照集與上一個快照集之間的差異。

這些數字是打開新的 Visual Studio 視窗中詳細的 記憶體使用量 報告視圖的連結。 快照詳細報告 顯示一個快照中的類型和實例。 快照差異(diff)報表 分析兩個快照中的類型和實例。

快照檢視連結的螢幕截圖

針對 C++,Objects (Diff) 欄位會命名為 Allocations (Diff)

圖像 描述
步驟 1 擷取快照集時記憶體中的物件總數。 選取此連結可顯示依類型實例計數排序的快照詳細數據報表。
步驟 2 這個快照集與上一個快照中的記憶體物件總數之間的差異。 選取此連結,即可顯示快照差異報表,依類型實例總數的差異排序。
步驟 3 擷取快照集時所用記憶體中的位元組總數。 選取此連結可顯示依類型實例大小總計排序的快照詳細數據報表。
步驟 4 前一個和此快照集中記憶體物件總大小的差異。 正數表示此快照集的記憶體大小大於前一個快照集,負數表示大小較小。 基線 表示該快照是診斷會話中的第一個。 無差異 表示差異為零。 選取此連結可顯示快照差異報表,依類型實例大小總計的差異排序。

快照集檢視連結

圖像 描述
步驟 1 擷取快照集時記憶體中的位元組數總數。 選取此連結可顯示依類型實例大小總計排序的快照詳細數據報表。
步驟 2 擷取快照集時記憶體中的物件總數。 選取此連結可顯示依類型實例計數排序的快照詳細數據報表。
步驟 3 此快照集中記憶體物件大小總計與上一個快照集中相比的差異。 正數表示此快照集的記憶體大小大於前一個快照集,負數表示大小較小。 基線 表示快照是診斷會話中的第一個。 無差異 表示差異為零。 選取此連結可顯示快照差異報表,依類型實例大小總計的差異排序。
步驟 4 這個快照集與上一個快照中的記憶體物件總數之間的差異。 選取此連結以顯示快照差異報表。 它會依類型實例總數的差異來排序。

管理型報告

在 [記憶體使用量] 摘要表中,選擇 物件 (Diff) 儲存格的目前連結。

已管理類型報告的螢幕快照。

注意

針對 .NET 程式代碼,檢視實例 圖示([物件類型] 資料行中的實例圖示只有在使用調試程式整合的記憶體使用量工具 或當您開啟 堆積快照集 並選擇 [偵錯 Managed Memory時,才能 使用 。

頂端窗格會顯示快照中類型的計數和大小,包括類型所參考的所有物件大小(內含大小)。

底部窗格中 [根路徑] 樹狀圖會顯示參照上方窗格所選類型的物件。 .NET 垃圾收集器只有在最後參考該物件的類別已被釋放時,才會回收物件的記憶體。 如需使用根 樹狀結構 路徑的詳細資訊,請參閱 分析根目錄的熱門路徑。

已管理類型報告的螢幕快照。

頂端窗格會顯示快照中各類型的數量和大小,包括此類型所參考的所有物件的大小(包括大小)。

底部窗格中 [根路徑] 樹狀結構會顯示參考上方窗格中所選取類型的物件。 .NET 垃圾收集器會在最後一個參考該物件的類型被釋放後,才清除物件的記憶體。

參考類型 樹狀結構圖會顯示上方窗格中所選取類型所持有的參考。

參考物件報表的螢幕截圖。

參考型別 樹狀結構會顯示上方窗格中所選取類型所保留的參考。

參考物件報表的螢幕截圖。

報表樹狀篩選器

應用程式開發人員不需要許多應用程式類型,即可調查記憶體問題。 快照報告篩選器可以隱藏 Managed Memory 中的大多數這些類型,以及 至根的路徑 樹狀結構。

記憶體使用量排序和篩選

記憶體使用量排序和篩選

  • 若要依類型名稱篩選樹狀結構,請在 [篩選] 方塊中輸入名稱。 篩選條件不區分大小寫,它會辨識類型名稱的任何部分中指定的字串。

  • 在 [篩選] 下拉式清單中選取 [只顯示我的程式碼],以隱藏由外部程式碼生成的大多數實例。 外部類型屬於操作系統或架構元件,或是由編譯程序產生。

  • 在 [篩選] 下拉式清單中選取 [折迭小型物件],以隱藏 大小(位元組) 小於總記憶體的 0.5%。

原生類型報表

在 [診斷工具] 視窗的 [記憶體使用量] 摘要表中,選擇 配置 (Diff)堆積大小 (Diff) 單元格的目前連結。

類型檢視 會顯示快照中類型的數目和大小。

  • 選擇選取類型旁 檢視實例 圖示,以顯示快照中所選類型對象的相關信息。

    實例 檢視會顯示所選類型的每個實例。 選取實例時,會在 [配置呼叫堆疊] 窗格中顯示出用於建立該實例的呼叫堆疊。 (這項資訊只能在偵錯時使用。

    實例檢視和配置呼叫堆疊窗格的螢幕快照。

  • 選擇實例圖示 (選取類型的 [物件類型] 資料行中的實例圖示),以顯示快照中所選類型物件的相關信息。

    實例 檢視會顯示所選類型的每個實例。 選取實例會顯示撥打堆疊,這導致在 [分配撥打堆棧] 窗格中建立實例。

    [實例] 檢視和 [配置呼叫堆棧] 窗格的螢幕截圖。

  • 選擇 [堆疊] 以查看所選類型的配置堆疊。

    堆疊檢視的螢幕快照。

  • 在 [檢視模式] 清單中,選擇 [堆棧檢視],以查看所選類型的配置堆棧。

    堆棧檢視的螢幕快照。

記憶體使用量深入解析

針對受控記憶體,記憶體分析工具還提供多種功能強大的內建自動分析見解。 在 [受控類型] 報告中選取 [Insights] 索引標籤,並顯示適用的自動深入解析,例如 重複字串疏鬆數位,以及 事件處理程式外泄。

記憶體使用量工具中深入解析檢視的螢幕快照。

重複字串 區段會顯示在堆積中多次分配的字串清單。 此外,本節會顯示浪費的總記憶體,也就是字串大小的 (實例數目 - 1) 倍。

稀疏陣列 區段顯示主要是零元素的陣列,這在效能和記憶體使用量方面可能效率不高。 記憶體分析工具會自動偵測這些陣列,並向您顯示由於這些零值而浪費了多少記憶體。

Visual Studio 2022 17.9 版 Preview 1 中提供的 事件處理程式流失 區段會顯示某個物件訂閱另一個物件事件時可能發生的記憶體流失。 如果事件的發行者比訂閱者活得久,即使沒有其他參考,訂閱者仍然存在。 這可能會導致記憶體流失,其中未使用的記憶體未正確釋放,導致應用程式在一段時間內使用越來越多的記憶體。

已知某些類型具有可讀取的欄位,以判斷其所持有的原生記憶體大小。 [Insights] 索引卷標會顯示物件圖形中的假原生記憶體節點,這些節點會由其父物件保留,讓 UI 能夠辨識它們並顯示其大小和參考圖表。

記憶體使用量工具中原生深入解析檢視的螢幕快照。

變更 (差異) 報告

  • 在 [記憶體使用量概觀] 頁面中,選擇 [快照集] 窗格中的變更連結。

    [選擇儲存格中的變更連結] 的螢幕快照。

    儲存格中「選擇變更連結」的螢幕截圖。

  • 在受管理或原生報表的 比較至 清單中,選擇一個快照。

    從「比較」列表中選擇一個快照的螢幕截圖。

    從「比較到」列表中選擇一個快照。

變更報表會將數據行 (標示為 (Diff)) 新增至基底報表,以顯示基底快照集值與比較快照集之間的差異。 以下是原生類型檢視差異報告的可能樣貌:

原生類型差異檢視的螢幕快照。

頂端視窗顯示快照中類型的計數和大小,包括類型所參考的所有物件的總大小(含括大小)。