Messen der Speicherauslastung in Visual StudioMeasure memory usage in Visual Studio

Suchen Sie Speicherverluste und ineffiziente Arbeitsspeichernutzung während des Debuggens mit dem im Debugger integrierten Speicherauslastungs-Diagnosetool.Find memory leaks and inefficient memory while you're debugging with the debugger-integrated Memory Usage diagnostic tool. Mit dem Speicherauslastungstool können Sie einen oder mehrere Momentaufnahmen des verwalteten und nativen Momentaufnahme-Heaps erstellen, um ein besseres Verständnis darüber zu erlangen, welchen Einfluss die Speicherauslastung von Objekttypen hat.The Memory Usage tool lets you take one or more snapshots of the managed and native memory heap to help understand the memory usage impact of object types. Sie können Momentaufnahmen von .NET-Apps, systemeigenen Apps und Apps in gemischtem Modus (.Net und systemeigen) erfassen.You can collect snapshots of .NET, native, or mixed mode (.NET and native) apps.

Das folgende Bild zeigt das Fenster Diagnosetools (verfügbar in Visual Studio 2015 Update 1 und höheren Versionen):The following graphic shows the Diagnostic Tools window (available in Visual Studio 2015 Update 1 and later versions):

Diagnosetools-Update1DiagnosticTools-Update1

Obwohl Sie Speichermomentaufnahmen des Arbeitsspeichers zu jedem beliebigen Zeitpunkt im Speicherauslastungstool erfassen können, können Sie mit dem Visual Studio-Debugger kontrollieren, wie Ihre Anwendung die Ausführung vornimmt, und dabei Leistungsprobleme untersuchen.Although you can collect memory snapshots at any time in the Memory Usage tool, you can use the Visual Studio debugger to control how your application executes while investigating performance issues. Festlegen von Haltepunkten, schrittweises Ausführen, alles unterbrechen und andere Debugger-Aktionen können Ihnen helfen, Ihre Leistungsuntersuchungen auf die relevantesten Codepfade zu fokussieren.Setting breakpoints, stepping, Break All, and other debugger actions can help you focus your performance investigations on the code paths that are most relevant. Durch die Ausführung dieser Aktionen, während Ihre App ausgeführt wird, kann das Rauschen, das Sie nicht interessiert, vom Code entfernt werden, wodurch sich der Zeitaufwand, den Sie zur Diagnose eines Problems benötigen, maßgeblich verringert.Performing those actions while your app is running can eliminate the noise from the code that doesn't interest you and can significantly reduce the amount of time it takes you to diagnose an issue.

Sie können das Speichertool auch außerhalb des Debuggers verwenden.You can also use the memory tool outside of the debugger. Siehe Analysieren der Arbeitsspeicherauslastung ohne Visual Studio-Debugger.See Memory Usage without debugging. Unter Windows 7 und höher können Sie die Profilerstellungstools ohne den Debugger verwenden.You can use the profiling tools with no debugger attached with Windows 7 and later. Windows 8 und höher ist erforderlich, um die Profilerstellungstools mit dem Debugger auszuführen (Fenster Diagnosetools).Windows 8 and later is required to run profiling tools with the debugger (Diagnostic Tools window).

Hinweis

Unterstützung für benutzerdefinierte Speicherbelegungen Der native Speicherprofiler sammelt auf die Speicherbelegung bezogene ETW--Ereignisdaten, die zur Laufzeit ausgegeben werden.Custom Allocator Support The native memory profiler works by collecting allocation ETW event data emitted during run time. Zuweisungen im CRT und Windows SDK wurden auf Quellebene kommentiert, sodass ihre Speicherbelegungsdaten erfasst werden können.Allocators in the CRT and Windows SDK have been annotated at the source level so that their allocation data can be captured. Wenn Sie Ihre eigenen Zuweisungen schreiben, kann jede Funktion, die einen Zeiger auf neu zugewiesenen Heapspeicher zurückgibt, mit __declspec(allocator) ergänzt werden, wie in diesem Beispiel für myMalloc zu sehen ist:If you are writing your own allocators, then any functions that return a pointer to newly allocated heap memory can be decorated with __declspec(allocator), as seen in this example for myMalloc:

__declspec(allocator) void* myMalloc(size_t size)

In diesem Tutorial werden Sie Folgendes durchführen:In this tutorial, you will:

  • Erstellen von Momentaufnahmen des SpeichersTake snapshots of memory
  • Analysieren der SpeicherauslastungsdatenAnalyze memory usage data

Sammeln von SpeicherauslastungsdatenCollect memory usage data

  1. Öffnen Sie das Projekt, das Sie in Visual Studio debuggen möchten, und legen Sie in Ihrer App einen Haltepunkt an dem Punkt fest, an dem Sie die CPU-Auslastung untersuchen möchten.Open the project you want to debug in Visual Studio and set a breakpoint in your app at the point where you want to begin examining memory usage.

    Wenn Sie über einen Bereich verfügen, bei dem Sie ein Speicherproblem vermuten, legen Sie den ersten Haltepunkt fest, bevor das Speicherproblem auftritt.If you have an area where you suspect a memory issue, set the first breakpoint before the memory issue occurs.

    Tipp

    Da es schwierig sein kann, das Speicherprofil eines Vorgangs zu erfassen, der für Sie von Interesse ist, wenn Ihre App häufig Speicher zuweist und dessen Speicherung wieder aufhebt, richten Sie zu Beginn und zum Ende des Vorgangs Haltepunkte ein (oder gehen Sie schrittweise durch den Vorgang), um so den genauen Punkt zu finden, an dem sich der Speicher geändert hat.Because it can be challenging to capture the memory profile of an operation that interests you when your app frequently allocates and de-allocates memory, set breakpoints at the start and end of the operation (or step through the operation) to find the exact point that memory changed.

  2. Legen Sie einen zweiten Haltepunkt am Ende der Funktion oder des Codebereichs an, den Sie analysieren möchten (oder nachdem ein vermutetes Speicherproblem aufgetreten ist).Set a second breakpoint at the end of the function or region of code that you want to analyze (or after a suspected memory issue occurs).

  3. Das Fenster Diagnosetools wird automatisch angezeigt, es sei denn, Sie haben es deaktiviert.The Diagnostic Tools window appears automatically unless you have turned it off. Klicken Sie auf Debuggen > Windows > Diagnosetools anzeigen, um das Fenster erneut aufzurufen.To bring up the window again, click Debug > Windows > Show Diagnostic Tools.

  4. Wählen Sie Speicherauslastung mit der Einstellung Auswahltools auf der Symbolleiste aus.Choose Memory Usage with the Select Tools setting on the toolbar.

    Fenster „Diagnosetools“Show Diagnostics Tools

  5. Klicken Sie auf Debuggen / Debugging starten (oder auf Start auf der Symbolleiste oder auf F5).Click Debug / Start Debugging (or Start on the toolbar, or F5).

    Wenn das Laden der Anwendung abgeschlossen ist, wird die Zusammenfassungsansicht der Diagnosetools angezeigt.When the app finishes loading, the Summary view of the Diagnostics Tools appears.

    Registerkarte „Zusammenfassung“ der DiagnosetoolsDiagnostics Tools Summary Tab

    Hinweis

    Da das Erfassen von Speicherdaten die Debugleistung Ihrer systemeigenen Apps oder Ihrer Apps mit gemischtem Modus beeinträchtigen kann, sind Speichermomentaufnahmen standardmäßig deaktiviert.Because collecting memory data can affect the debugging performance of your native or mixed-mode apps, memory snapshots are disabled by default. Starten Sie eine Debugsitzung, um Momentaufnahmen in nativen Apps oder in Apps im gemischten Modus zu aktivieren. Nutzen Sie dazu die Tastenkombination F5.To enable snapshots in native or mixed-mode apps, start a debugging session (Shortcut key: F5). Wenn das Fenster Diagnosetools angezeigt wird, wählen Sie die Registerkarte Speicherauslastung und dann Heapprofilerstellung aus.When the Diagnostic Tools window appears, choose the Memory Usage tab, and then choose Heap Profiling.

    Momentaufnahmen aktivierenEnable snapshots

    Beenden Sie den Debugvorgang (Tastenkombination: UMSCHALTTASTE+F5), und starten Sie ihn neu.Stop (Shortcut key: Shift+F5) and restart debugging.

  6. Um eine Momentaufnahme zu Beginn der Debugsitzung zu erstellen, wählen Sie auf der Übersichtssymbolleiste Speicherauslastung die Option Momentaufnahme erstellen aus.To take a snapshot at the start of your debugging session, choose Take snapshot on the Memory Usage summary toolbar. (Es kann hilfreich sein, auch hier einen Haltepunkt festzulegen.)(It may help to set a breakpoint here as well.)

    Schaltfläche „Momentaufnahme erstellen“Take snapshot

    Tipp

    Um eine Basislinie für Speichervergleiche zu erstellen, sollten Sie zu Beginn Ihrer Debugsitzung eine Momentaufnahme erstellen.To create a baseline for memory comparisons, consider taking a snapshot at the start of your debugging session.

  7. Führen Sie das Szenario aus, bei dem Ihr erster Haltepunkt erreicht wird.Run the scenario that will cause your first breakpoint to be hit.

  8. Wählen Sie Momentaufnahme erstellen auf der Übersichtssymbolleiste Speicherauslastung aus, während der Debugger am ersten Haltepunkt angehalten wird.While the debugger is paused at the first breakpoint, choose Take snapshot on the Memory Usage summary toolbar.

  9. Drücken Sie F5, um die App bis zum zweiten Haltepunkt auszuführen.Press F5 to run the app to your second breakpoint.

  10. Erstellen Sie nun eine andere Momentaufnahme.Now, take another snapshot.

    An diesem Punkt können Sie beginnen, die Daten zu analysieren.At this point, you can begin to analyze the data.

Analysieren der SpeicherauslastungsdatenAnalyze memory usage data

Die Zeilen der Speicherauslastungs-Übersichtstabelle führt die Momentaufnahmen auf, die Sie während der Debugsitzung erstellt haben, und bietet Links zu detaillierteren Ansichten.The rows of Memory Usage summary table lists the snapshots that you have taken during the debugging session and provides links to more detailed views.

Tabelle mit zusammengefassten Informationen zum SpeicherMemory summary table

Der Name der Spalten ist abhängig von dem Debugmodus, den Sie in den Projekteigenschaften gewählt haben: .NET, nativ oder gemischt (sowohl .NET als auch nativ).The name of the columns depend on the debugging mode you choose in the project properties: .NET, native, or mixed (both .NET and native).

  • Die Spalten Objekte (Diff.) und Zuweisungen (Diff.) zeigen die Anzahl der Objekte im .NET-Speicher und im nativen Speicher zum Zeitpunkt der Erstellung der Momentaufnahme an.The Objects (Diff) and Allocations (Diff) columns display the number of objects in .NET and native memory when the snapshot was taken.

  • Die Spalte Heapgröße (Diff) zeigt die Anzahl der Bytes in den .NET- und nativen HeapsThe Heap Size (Diff) column displays the number of bytes in the .NET and native heaps

Wenn Sie mehrere Momentaufnahmen erstellt haben, beinhalten die Zellen der Übersichtstabelle die Wertänderung zwischen Zeilenmomentaufnahme und vorheriger Momentaufnahme.When you have taken multiple snapshots, the cells of the summary table include the change in the value between the row snapshot and the previous snapshot.

Um die Speicherauslastung zu analysieren, klicken Sie auf einen der Links. Ein detaillierter Bericht der Speicherauslastung wird geöffnet:To analyze memory usage, click one of the links that opens up a detailed report of memory usage:

  • Wählen Sie die Änderungsverknüpfung links des Pfeils aus (Zunahme der Speicherauslastung), um sich die Details des Unterschiedes zwischen aktueller Momentaufnahme und vorheriger Momentaufnahme anzeigen zu lassen.To view details of the difference between the current snapshot and the previous snapshot, choose the change link to the left of the arrow (Memory Usage Increase). Ein roter Pfeil zeigt eine Zunahme der Speicherauslastung und ein grüner Pfeil die Abnahme der Speicherauslastung.A red arrow indicates an increase in memory usage, and a green arrow to indicates a decrease.

Tipp

Um Speicherprobleme schnell auszumachen, werden die Unterschiedsberichte nach Objekttypen sortiert, deren Anzahl sich am stärksten erhöht hat (klicken Sie auf die Änderungsverknüpfung in der Spalte Objekte (Diff.) ) oder deren gesamte Heapgröße sich am signifikantesten erhöht hat (klicken Sie auf die Änderungsverknüpfung in der Spalte Heapgröße (Diff.) ).To help identify memory issues more quickly, the diff reports are sorted by object types that increased the most in overall number (click the change link in Objects (Diff) column) or that increased the most in overall heap size (click the change link in Heap Size (Diff) column).

  • Um nur die Details der ausgewählten Momentaufnahme anzuzeigen, klicken Sie auf die Verknüpfung ohne Änderung.To view details of only the selected snapshot, click the non-change link.

    Der Bericht wird in einem separaten Fenster angezeigt.The report appears in a separate window.

Berichte zu den verwalteten TypenManaged types reports

Wählen Sie die aktuelle Verknüpfung einer Objekte (Diff.) - oder Zuweisungen (Diff.) -Zelle in der Übersichtstabelle der Speicherauslastung aus.Choose the current link of a Objects (Diff) or Allocations (Diff) cell in the Memory Usage summary table.

Debugger; Berichte zu den verwalteten Typen; Pfade zum StammDebugger managed type report - Paths to Root

Im oberen Bereich werden Anzahl und Größe der Typen in der Momentaufnahme angezeigt, einschließlich der Größe aller Objekte, auf die der Typ verweist (Umfassende Größe).The top pane shows the count and size of the types in the snapshot, including the size of all objects that are referenced by the type (Inclusive Size).

Die Baumstruktur Pfade zum Stamm im unteren Bereich zeigt die Objekte an, die auf den im oberen Bereich ausgewählten Typ verweisen.The Paths to Root tree in the bottom pane displays the objects that reference the type selected in the upper pane. Der .NET-Garbage Collector bereinigt den Speicher für ein Objekt nur, wenn der letzte Typ, der darauf verweist, freigegeben wurde.The .NET garbage collector cleans up the memory for an object only when the last type that references it has been released.

Die Baumstruktur Referenzierte Objekte enthält die Verweise, die vom im oberen Bereich ausgewählten Typ gehalten werden.The Referenced Objects tree displays the references that are held by the type selected in the upper pane.

Berichtsansicht für verwaltete referenzierte ObjekteManaged referenced objects report view

Klicken Sie auf das Symbol Instanzsymbol, um die Instanzen eines ausgewählten Typs im oberen Bereich anzuzeigen.To display the instances of a selected type in the upper pane, choose the Instance icon icon.

Ansicht „Instanzen“Instances view

Die Ansicht Instanzen zeigt die Instanzen des ausgewählten Objekts in der Momentaufnahme des oberen Bereichs an.The Instances view displays the instances of the selected object in the snapshot in the upper pane. Die Bereiche Pfade zum Stamm und Referenzierte Objekte zeigen die Objekte an, die auf die ausgewählte Instanz verweisen, sowie die Typen, auf die die ausgewählte Instanz verweist.The Paths to Root and Referenced Objects pane displays the objects that reference the selected instance and the types that the selected instance references. Wenn der Debugger zu dem Zeitpunkt beendet wird, an dem die Momentaufnahme erstellt wurde, können Sie auf die Zelle Wert zeigen, um die Werte des Objekts in einer QuickInfo anzuzeigen.When the debugger is stopped at the point where the snapshot was taken, you can hover over the Value cell to display the values of the object in a tool tip.

Berichte zu den systemeigenen TypenNative type reports

Wählen Sie die aktuelle Verknüpfung einer Zelle Zuordnungen (Diff.) oder Heapgröße (Diff.) aus der Speicherauslastungs-Übersichtstabelle des Fensters Diagnosetools aus.Choose the current link of a Allocations (Diff) or Heap Size (Diff) cell in the Memory Usage summary table of the Diagnostic Tools window.

Ansicht der nativen TypenNative Type View

Die Typenansicht zeigt die Anzahl und Größe der Typen in der Momentaufnahme an.The Types View displays the number and size of the types in the snapshot.

  • Wählen Sie das Instanzensymbol (Instanzensymbol in der Spalte „Objekttyp“) eines ausgewählten Typs aus, um sich Informationen zu Objekten des ausgewählten Typs in der Momentaufnahme anzeigen zu lassen.Choose the instances icon (The instance icon in the Object Type column) of a selected type to display information about the objects of the selected type in the snapshot.

    Die Ansicht Instanzen zeigt jede Instanz des ausgewählten Typs an.The Instances view displays each instance of the selected type. Durch Auswahl einer Instanz wird die Aufrufliste angezeigt, welche die Erstellung der Instanz im Bereich Belegungsaufrufliste bewirkt hat.Selecting an instance displays the call stack that resulted in the creation of the instance in the Allocation Call Stack pane.

    Ansicht „Instanzen“Instances view

  • Wählen Sie Stapelansicht im Ansichtsmodus , um den Zuweisungsstapel für den ausgewählten Typ anzuzeigen.Choose Stacks View in the View Mode list to see the allocation stack for the selected type.

    StapelansichtStacks View

(Diff) ÄnderungsberichteChange (Diff) reports

  • Wählen Sie die Änderungsverknüpfung in einer Zelle der Übersichtstabelle der Registerkarte Speicherauslastung im Fenster Diagnosetools aus.Choose the change link in a cell of the summary table of the Memory Usage tab on the Diagnostic Tools window.

    Änderungs bzw. Unterschiedsbericht auswählenChoose a change (diff) report

  • Wählen Sie eine Momentaufnahme aus der Liste Vergleichen mit Liste eines verwalteten oder systemeigenen Berichts aus.Choose a snapshot in the Compare To list of a managed or native report.

    Auswählen einer Momentaufnahme aus der Liste „Vergleichen mit“Choose a snapshot from the Compare To list

Der Änderungsbericht fügt dem Basisbericht Spalten (durch (Diff) gekennzeichnet) hinzu, die den Unterschied zwischen der Basismomentaufnahme und der Vergleichsmomentaufnahme anzeigen.The change report adds columns (marked with (Diff)) to the base report that show the difference between the base snapshot value and the comparison snapshot. So könnte ein Unterschiedsbericht der Ansicht mit nativen Typen aussehen:Here's how a Native Type View diff report might look:

Ansicht „Unterschiede bei nativen Typen“Native Types Diff View

Blogs und VideosBlogs and videos

Analyze CPU and Memory While Debugging (Analysieren der CPU und des Arbeitsspeichers beim Debuggen)Analyze CPU and Memory While Debugging

Visual C++ Team Blog: Memory Profiling in Visual C++ 2015 (Visual C++-Teamblog: Speicherprofilerstellung in Visual C++ 2015)Visual C++ Blog: Memory Profiling in Visual C++ 2015

Nächste SchritteNext steps

In diesem Tutorial haben Sie gelernt, wie Speicherauslastungsdaten gesammelt und analysiert werden.In this tutorial, you've learned how to collect and analyze memory usage data. Wenn Sie die tour of the profiler (Einführung zum Profilerstellungsfeature) bereits abgeschlossen haben, sollten Sie sich einen Überblick darüber verschaffen, wie die CPU-Nutzung in Ihren Apps analysiert werden kann.If you already completed the tour of the profiler, you may want to get a quick look at how to analyze CPU usage in your apps.