5

私はモノタッチでメモリリークをなくすために取り組んでおり、ここ数日で多くのことを学びました。たとえば、ほとんどの場合、ガベージコレクションが成功する前にフックを解除する必要があるイベントです:)

しかし、プロフィラー ツールをいじってみると、ほとんどのメモリが文字列によって使用されていることがわかります (またはそのように見えます)。次のスクリーン ダンプを参照してください。 ここに画像の説明を入力

ここに画像の説明を入力

しかし、ご覧のとおり、一部のメモリは mono でも使用されています。私はビューモデルとビューを操作してきましたが、これらのほとんどは正しくガベージコレクションされています。文字列を調べると、それらが参照されていることがあり、この情報をどうするかわかりません。文字列が使用するメモリの量を減らすことができるかどうか、何か提案はありますか:)これらの数値が何を意味するのかを説明するチュートリアルなどを見つけようとしましたが、運がありませんでした。どんな助けでも大歓迎です。

4

2 に答える 2

3

私の個人的な経験からのいくつかの答え:

  • チュートリアルについては、 http://docs.xamarin.com/ios/Guides/Deployment%252c_Testing%252c_and_Metrics/Monotouch_Profilerについてしか知りません

  • 「逆参照」オプションは最も便利な機能の 1 つだと思います。重要なのは、大量の文字列があることではなく、それらの文字列を所有しているものです。

  • アプリが大きくなり、MvvmCross、JSON.Net、SQLite-net などのコンポーネントをますます多く使用するようになったため、これらのバグを見つける最善の方法は、単純なテスト ハーネスおよび/またはテスト シーケンスでバグを再現することであることがわかりました。より多くの非同期的な方法がある場合は、これらのコンポーネントの数を減らしてリークを特定する必要があることに気付きます。

  • 簡単なテスト ハーネスを用意したら、HeapShot のフィルター オプションが役立ちます。既知の名前空間にあるクラスに集中できるからです。

  • 簡単なテスト ハーネスを作成したら、2 つの HeapShot を比較することも役立ちます。テスト UI のどのアクションが、HeapShot 間で何が増加するかを調べます。

    違いは重要です- 一部のライブラリは意図的にメモリにキャッシュします - たとえば、HeapShot イメージ内の PropertyInfo の一部は、逆シリアル化の速度を向上させるためにライブラリの 1 つによって意図的にキャッシュされる場合があります。


相互参照を容易にするために、リンクされた質問へのリンクを追加します。

于 2013-02-11T13:48:51.867 に答える
2

スチュアートの素​​晴らしい答えに加えて、私はあなたがデバイス上でプロファイリングするべきであることを強調したいと思います。デバイスでの実行は実行時のパフォーマンスのために調整され、シミュレーターはビルドのパフォーマンスのために調整されます(編集とデバッグのサイクルが可能な限り高速になるように)。特に、シミュレータでは、デバイスよりも実行時に多くのメモリが使用されることを意味します。

于 2013-02-11T14:23:35.743 に答える