チュートリアル - Apple の Instruments ツールの使用

この記事では、Apple の Instruments ツールを使用して、Xamarin でビルドされた iOS アプリケーションのメモリ問題を診断する方法について説明します。 Instruments を起動し、ヒープ スナップショットを取得してメモリの増加を分析する方法を示します。 また、Instruments を使用して、メモリの問題を引き起こしている正確なコード行を表示および特定する方法も示します。

このページでは、Xcode の Instruments ツールを使用して iOS アプリケーションのメモリ問題を診断する方法を示します。 最初に、MemoryDemo サンプルをダウンロードし、Visual Studio for Mac で before ソリューションを開きます。

メモリ問題を診断する

  1. Visual Studio for Macから、[ツール>] [インストルメントの起動] メニュー項目から [Instruments] を起動します。

  2. [デバイスへのアップロードの実行>] メニュー項目を選択して、アプリケーションをデバイスにアップロードします。

  3. [Allocations]\(割り当て\) テンプレート (白のボックスがあるオレンジ色のアイコン) を選択します。

    [Allocations]\(割り当て\) テンプレートを選択する

  4. ウィンドウの上部にある [Choose a profiling template for:]\(プロファイリング テンプレートの選択\) リストで [Memory Demo] アプリケーションを選択します。 最初に iOS デバイスをクリックして、インストールされたアプリケーションが表示されたメニューを展開します。

    MemoryDemo アプリケーションを選択する

  5. (ウィンドウの右下にある) [選択] ボタンを押し、Instruments を起動します。 このテンプレートは、上部ウィンドウに 2 つの項目を表示します。[Allocations]\(割り当て\) と [VM Tracker]\(VM トラッカー\) です。

  6. Instruments でレコード ボタン (左上の赤い円) を押すと、アプリケーションが起動します。

  7. 上部ウィンドウ (アプリが実行中で、[Dirty]\(ダーティ\) と [Resident Size]\(常駐サイズ\) の 2 つのセクションが含まれます) で [VM Tracker]\(VM トラッカー\) 行を選択します。 [Inspector]\(検査\) ウィンドウで、 [Show Display Settings]\(表示設定の表示\) オプション (歯車アイコン) を選択し、スクリーンショットの右下に表示されている [Automatic Snapshotting]\(スナップショットの自動作成\) チェックボックスをオンにします。

    [Show Display Settings]\(表示設定の表示\) オプション (歯車アイコン) を選択し、[Automatic Snapshotting]\(スナップショットの自動作成\) チェックボックスをオンにする

  8. 上部ウィンドウ (アプリが実行中で、 [All Heap and Anonymous VM]\(すべてのヒープと匿名 VM\) と表示されます) で [Allocations]\(割り当て\) 行を選択します。

  9. [Inspector]\(検査\) ウィンドウで、 [Show Display Settings]\(表示設定の表示\) オプション (歯車アイコン) を選択し、 [Mark Generation]\(マークの生成\) ボタンを押してベースラインを確立します。 ウィンドウの上部のタイムラインに小さな赤いフラグが表示されます。

  10. アプリケーションをスクロールし、 [Mark Generation]\(マークの生成\) をもう一度選択します (数回繰り返します)。

  11. [ 停止 ] ボタンをクリックします。

  12. [Growth]\(増加\) が最も大きい Generation ノードを展開し、 [Growth]\(増加\) で並べ替えます (降順)。

  13. [Inspector]\(検査\) ウィンドウをスタック トレース を示す [Show Extended Detail]\(拡張詳細の表示\) ("E") に変更します。

  14. オブジェクト>以外のノードに<過剰なメモリ増加が表示されていることに注意してください。 詳細を表示するにはこのノードの横にある矢印をクリックします。スタック トレース内を右クリックして、ウィンドウに [Source Location]\(ソースの場所\) を追加します。

    ソースの場所をウィンドウに追加する

  15. [サイズ] で並べ替え、[拡張詳細] ビューを表示します。

    サイズで並べ替え、拡張詳細ビューを表示する

  16. 呼び出し履歴で目的のエントリをクリックして、関連するコードを表示します。

    関連するコードを表示する

この場合、新しいイメージが作成されて各セルのコレクションに保存され、既存のコレクション ビューは再利用されません。

メモリ問題の解決

Instruments を使用してこれらの問題を解決し、アプリケーションを再実行することができます。

クラス レベルで 1 つのインスタンスを宣言することで、イメージとセル オブジェクトを毎回作成する代わりに、次のように既存のプールから再利用することができます。

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;
}

これで、アプリケーションを実行したときのメモリ使用量が大幅に減少します。生成間の [Growth]\(増加\) は、コードを修正する前の MiB (メガバイト単位) ではなく、Kib (キロバイト単位) で測定されるようになりました。

アプリのメモリ使用量を表示する

改善されたコードは、Visual Studio for Mac の after ソリューションの MemoryDemo サンプルで入手できます。

記事「Xamarin.iOS ガベージ コレクション」は、Xamarin.iOS でのメモリの問題に対処するための便利なリファレンスです。

まとめ

この記事では、Instruments を使用してメモリの問題を診断する方法を紹介しました。 Visual Studio for Mac 内から Instruments を起動して、メモリ割り当てのテンプレートを読み込み、スナップショットを使用してメモリの問題を特定する方法を説明しました。 最後に、問題が解決されたことを確認するため、アプリケーションを再検証しました。