Exemplarische Vorgehensweise: Verwenden des Apple-Tools „Instruments“

Dieser Artikel erläutert die Verwendung des Apple-Tools „Instruments“, um Arbeitsspeicherprobleme in einer iOS-Anwendung zu diagnostizieren, die mit Xamarin erstellt wurde. Es wird gezeigt, wie Instruments gestartet wird, wie Heap-Momentaufnahmen erfasst werden und wie der Anstieg des benötigten Speichers analysiert wird. Es wird ebenfalls gezeigt, wie Instruments dafür verwendet wird, die genaue Codezeile zu ermitteln und anzuzeigen, die das Arbeitsspeicherproblem verursacht.

Diese Seite erläutert, wie das Xcode-Tool Instruments dafür verwendet wird, Arbeitsspeicherprobleme in einer iOS-Anwendung zu diagnostizieren. Laden Sie zunächst das MemoryDemo-Beispiel herunter und öffnen Sie die Projektmappe before in Visual Studio für Mac.

Diagnostizieren von Arbeitsspeicherproblemen

  1. Starten Sie Visual Studio für Mac über den Menüelement Tools > Launch Instruments .

  2. Laden Sie die Anwendung auf das Gerät hoch, indem Sie das Menüelement Auf Gerät hochladen ausführen > auswählen.

  3. Wählen Sie die Vorlage Zuordnungen (orangefarbenes Symbol mit weißem Feld) aus.

    Auswählen der Vorlage

  4. Wählen Sie die Anwendung Memory Demo aus der Liste Choose a profiling template for: (Profilerstellungsvorlage auswählen für:) im oberen Bereich des Fensters aus. Klicken Sie zunächst auf das iOS-Gerät, um das Menü zu erweitern, das die installierten Anwendungen anzeigt.

    Wählen Sie die Anwendung

  5. Drücken Sie auf die Schaltfläche Auswählen (unten rechts im Fenster), um Instrumente zu starten. Durch die Auswahl dieser Vorlage werden zwei Elemente im oberen Bereich angezeigt: „Allocations“ (Speicherbelegung) und „VM Tracker“ (VM-Tracker).

  6. Klicken Sie auf in Instruments auf die Schaltfläche Aufnehmen (roter Kreis oben links), um die Anwendung zu starten.

  7. Wählen Sie im oberen Bereich die Zeile VM-Tracker aus. Da die App nun ausgeführt wird, enthält diese zwei Abschnitte: Dirty Size und Resident Size. Wählen Sie im Bereich Inspektor die Option Show Display Settings (Anzeigeeinstellungen anzeigen) (das Zahnradsymbol) aus, und aktivieren Sie dann das Kontrollkästchen Automatic Snapshotting (Automatische Momentaufnahme), das unten rechts auf diesem Screenshot angezeigt wird:

    Wählen Sie die Option Anzeigeeinstellungen anzeigen das Zahnradsymbol aus, und aktivieren Sie dann das Kontrollkästchen Automatische Momentaufnahme

  8. Wählen Sie im oberen Bereich die Zeile Zuordnungen aus. Da die App nun ausgeführt wird, zeigt diese All Heap and Anonymous VM (Alle Heaps und anonymen VMs) an.

  9. Wählen Sie im Bereich Inspektor die Option Anzeigeeinstellungen anzeigen (das Zahnradsymbol) aus, und klicken Sie dann auf die Schaltfläche Mark Generation (Markierungsgenerierung), um eine Baseline zu erstellen. Eine kleine rote Flagge wird im oberen Bereich des Fensters auf der Zeitachse angezeigt.

  10. Scrollen Sie durch die Anwendung, und klicken Sie dann erneut auf Markierungsgenerierung (mehrmals wiederholen).

  11. Klicken Sie auf die Schaltfläche Beenden .

  12. Erweitern Sie den Knoten Generierung, der das größte Wachstum aufweist, und sortieren Sie nach Wachstum (absteigend).

  13. Ändern Sie den Bereich Inspektor in Show Extended Detail (Erweiterte Details anzeigen) (das „E“), wodurch die Stapelüberwachung angezeigt wird.

  14. Beachten Sie, dass der <Nicht-Objektknoten> übermäßiges Arbeitsspeicherwachstum aufweist. Klicken Sie auf den Pfeil neben diesem Knoten, um weitere Details anzuzeigen. Klicken Sie mit der rechten Maustaste auf die Stapelüberwachung, um einen Quellort zum Bereich hinzuzufügen:

    Hinzufügen des Quellspeicherorts zum Bereich

  15. Sortieren Sie nach Größe , und zeigen Sie die Erweiterte Detailansicht an:

    Sortieren nach Größe und Anzeigen der erweiterten Detailansicht

  16. Klicken Sie auf den gewünschten Eintrag in der Aufrufliste, um den zugehörigen Code anzeigen zu lassen:

    Anzeigen des zugehörigen Codes

In diesem Fall wird ein neues Bild erstellt und für jede Zelle in einer Auflistung gespeichert. Die bestehenden Zellen der Auflistungsansicht werden nicht wiederverwendet.

Lösen von Arbeitsspeicherproblemen

Es ist möglich, diese Probleme zu beheben und die Anwendung erneut mithilfe von Instruments auszuführen.

Indem Sie eine einzelne Instanz auf Klassenebene deklarieren, können das Bild und das Zellenobjekt wie im Folgenden dargestellt aus einem vorhandenen Pool wiederverwendet werden, statt jedes Mal erneut erstellt werden zu müssen:

public override UICollectionViewCell GetCell (UICollectionView collectionView, NSIndexPath indexPath)
{
    // Dequeue a cell from the reuse pool
    var imageCell = (ImageCell)collectionView.DequeueReusableCell (cellId, indexPath);

    // Reuse the image declared at the class level
    imageCell.ImageView.Image = image;

    return imageCell;
}

Nun, da die Anwendung ausgeführt wird, ist die Arbeitsspeicherauslastung erheblich reduziert. Das Wachstum der Generierungen wird nun in KiB (Kilobyte) statt wie vor dem Korrigieren des Codes in MiB (Megabyte) gemessen:

Anzeigen der App-Speicherauslastung

Der verbesserte Code ist in Visual Studio für Mac in der Projektmappe after im MemoryDemo-Beispiel verfügbar.

Der Artikel Xamarin.iOS Garbage Collection ist eine nützliche Referenz zum Behandeln von Speicherproblemen mit Xamarin.iOS.

Zusammenfassung

In diesem Artikel wurde die Verwendung von Instruments zum Diagnostizieren von Arbeitsspeicherproblemen erläutert. Es wurde beschrieben, wie Instrumente von Visual Studio für Mac aus gestartet werden, wie die Vorlage für die Arbeitsspeicherzuordnung geladen wird und wie Momentaufnahmen verwendet werden, um Arbeitsspeicherprobleme zu ermitteln. Schließlich wurde die Anwendung erneut überprüft, um sicherzustellen, dass das Problem behoben wurde.