分享方式:


在不使用效能分析工具中偵錯的情況下分析記憶體使用量 (C#、Visual Basic、C++、F#)

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

不論有無偵錯工具,都可以執行 [記憶體使用量] 工具。 在本文中,我們會示範如何使用「記憶體使用量」工具而不搭配 Visual Studio 效能分析工具中的偵錯工具,針對發行組建建議這麼做。 如需為您的需求選擇最佳記憶體分析工具的詳細資訊,請參閱選擇記憶體分析工具

[記憶體使用量] 診斷工作階段

開始 [記憶體使用量] 診斷工作階段:

  1. 在 Visual Studio 中開啟專案。

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

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

  3. 在功能表列上,依序選取 [偵錯] > [效能分析工具]

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

    Start a Memory Usage diagnostic session.

    Start a Memory Usage diagnostic session.

監視記憶體使用情況

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

Screenshot of the Diagnostic Tools window in the Visual Studio Performance Profiler showing a timeline graph of the app's memory use.

Screenshot of the Diagnostic Tools window in the Visual Studio Performance Profiler showing a timeline graph of the app's memory use.

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

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

應用程式會使用大量的物件,您可能會想專注分析單一案例。 或者,您可能會發現要調查的記憶體問題。 您可以在診斷工作階段期間擷取快照,以便擷取特定時刻的記憶體使用量。 最好是在出現記憶體問題之前,先取得應用程式的基準快照集。 您可以在第一次發生問題之後擷取另一個快照集,如果可以重複此案例,則可以建立其他快照集。

若要收集快照,當您想要擷取記憶體資料時,請選取 [擷取快照]

Screenshot of taking a snapshot.

關閉診斷工作階段

若要停止監控工作階段而不建立報表,只需關閉診斷視窗。 當您完成時收集或擷取快照時若要產生報表,請選取 [停止收集]

Screenshot of stopping the collection.

Screenshot of stopping the collection.

如果您無法收集或顯示資料,請參閱針對分析錯誤進行疑難排解並修正問題

[記憶體使用量] 報表

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

Screenshot of the overview page in the Memory Usage tool in the Visual Studio Performance Profiler, showing a memory usage graph and two snapshot panes.

Screenshot of the overview page in the Memory Usage tool in the Visual Studio Performance Profiler, showing a memory usage graph and two snapshot panes.

記憶體使用量快照集

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

數字是連結,其會在新的 Visual Studio 視窗中開啟詳細的 [記憶體使用量] 報表檢視。 快照詳細資料報表顯示一張快照中的類型和執行個體。 快照差異 (diff) 報表會比較兩張快照的類型和執行個體。

Screenshot of Snapshot view links

對於 C++,物件 (差異) 資料行名為 配置數 (差異)

映像 描述
Step 1 在擷取快照時,記憶體中的物件總數。 選取這個連結可以顯示快照詳細資料報表,此報表依類型執行個體的計數進行排序。
Step 2 此快照中的記憶體物件與上一個快照物件總數之間的差異。 選取這個連結可以顯示快照差異報表,此報表依執行個體類型的總計數差異進行排序。
Step 3 在擷取快照時,記憶體中的總位元組數。 選取這個連結可以顯示快照詳細資料報表,此報表依類型執行個體的大小總計進行排序。
Step 4 此快照中記憶體物件與上一個快照物件之大小總計之間的差異。 正數表示此快照的記憶體大小大於與上一個快照,負數則表示大小較小。 基準表示快照是診斷工作階段中的第一個。 無任何差異表示差異為零。 選取這個連結可以顯示快照差異報表,此報表依執行個體類型的大小總計差異進行排序。

Snapshot view links

映像 描述
Step 1 在擷取快照時,記憶體中的總位元組數。 選取這個連結可以顯示快照詳細資料報表,此報表依類型執行個體的大小總計進行排序。
Step 2 在擷取快照時,記憶體中的物件總數。 選取這個連結可以顯示快照詳細資料報表,此報表依類型執行個體的計數進行排序。
Step 3 此快照中記憶體物件與上一個快照物件之大小總計之間的差異。 正數表示此快照的記憶體大小大於與上一個快照,負數則表示大小較小。 基準表示快照是診斷工作階段中的第一個。 無任何差異表示差異為零。 選取這個連結可以顯示快照差異報表,此報表依執行個體類型的大小總計差異進行排序。
Step 4 此快照中的記憶體物件與上一個快照物件總數之間的差異。 選取此連結以顯示快照集差異報表。 報表會依類型執行個體總數的差異來排序。

Managed 類型報表

選擇「記憶體使用量」摘要表中物件 (差異)資料格的目前連結。

Screenshot of managed type report.

注意

對於 .NET 程式碼,檢視執行個體圖示 (The instance icon in the Object Type column) 僅在使用整合偵錯工具的記憶體使用量工具或開啟堆積快照並選擇偵錯受控記憶體時才可使用。

Screenshot of managed type report.

上方窗格顯示快照中所有類型的計數和大小,包括類型參考之所有物件的大小 ([內含大小])。

下方窗格中的 [根的路徑] 樹狀結構顯示參考在上方窗格中選取之類型的物件。 您必須釋放參考物件的最後一個類型,.NET 記憶體回收行程才會清除該物件的記憶體。

[參考的類型] 樹狀結構顯示在上方窗格中選取之類型所持有的參考。

Screenshot of Referenced Objects report.

[參考的類型] 樹狀結構顯示在上方窗格中選取之類型所持有的參考。

Screenshot of Referenced Objects report.

報表樹狀目錄篩選條件

在應用程式中,有許多類型對於應用程式開發人員而言並非必要項目。 快照報表篩選條件可以在 [受控記憶體] 和 [根的路徑] 樹狀結構中,隱藏這些類型的大部分。

Sort and filter options

Sort and filter options

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

  • 選取篩選條件下拉式清單中的顯示 Just My Code,隱藏外部程式碼所產生的大部分執行個體。 外部類型屬於作業系統或架構元件,或者由編輯器產生。

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

原生類型報表

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

Screenshot of Native Type View.

Screenshot of Native Type View.

[類型檢視] 顯示快照中所有類型的數目和大小。

  • 選擇所選類型旁的檢視執行個體圖示可顯示快照中所選類型之物件的資訊。

    [執行個體] 檢視顯示所選類型的每個執行個體。 選取執行個體會顯示在 [配置呼叫堆疊] 窗格中建立執行個體時所產生的呼叫堆疊。

    Screenshot of the Instances view and Allocation Call Stack pane.

  • 選擇所選類型的執行個體圖示 (The instance icon in the Object Type column),以顯示快照集中所選類型的物件相關資訊。

    [執行個體] 檢視顯示所選類型的每個執行個體。 選取執行個體會顯示在 [配置呼叫堆疊] 窗格中建立執行個體時所產生的呼叫堆疊。

    Screenshot of the Instances view and Allocation Call Stack pane.

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

    Screenshot of Stacks view.

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

    Screenshot of Stacks view.

記憶體使用量深入解析

對於受控記憶體,記憶體分析工具還提供多個強大的內建自動深入解析。 選擇受控類型報告中的深入解析索引標籤,它會顯示適用的自動深入解析,例如重複字串疏鬆陣列事件處理常式遺漏

Screenshot of the insight view in the Memory Usage tool.

[重複字串] 區段會顯示堆積上多次配置的字串清單。 此外,此區段也會顯示浪費的記憶體總量,亦即 (執行個體數目 - 1) 乘以字串的大小。

[疏鬆陣列] 區段會顯示大部分填入零元素的陣列,這在效能和記憶體使用量方面可能效率低下。 記憶體分析工具會自動偵測這些陣列,並顯示由於這些零值而浪費多少記憶體。

Visual Studio 2022 版本 17.9 預覽版 1 中提供的事件處理常式流失區段,顯示當某個物件訂閱另一個物件的事件時可能發生的記憶體流失。 如果事件的發佈者比訂閱者存活得更久,則訂閱者仍然會保持存活的狀態 (即使沒有其他的參考指向它也一樣)。 這可能會導致記憶體洩漏 (即未使用的記憶體沒有被正確地釋放),進而導致應用程式隨著時間的移動而使用越來越多的記憶體。

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

Screenshot of the native insight view in the Memory Usage tool.

變更 (差異比對) 報表

  • 在「記憶體使用量」概述頁面中,選擇快照集窗格儲存格中的變更連結。

    Screenshot of Choose a change link in a cell.

    Screenshot of Choose a change link in a cell.

  • 在 Managed 或原生報表的 [比較] 清單中,選擇一個快照。

    Screenshot of Choose a snapshot from the Compare with list.

    Screenshot of Choose a snapshot from the Compare To list.

變更報表會將顯示基礎快照值與比較快照之間有差異的資料行 (標記為 [(差異比對)] ),加入基礎報表。 以下是原生類型檢視差異比對報表可能的樣子:

Screenshot of Native Types Diff View.

Screenshot of Native Types Diff View.

上方窗格顯示快照中所有類型的計數和大小,包括類型參考之所有物件的大小 ([內含大小])。