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