1

私はメモリリークについてフレックスモバイルアプリケーションのプロファイルを作成しようとしてきましたが、非常に説明のつかない結果が得られたため、フレックスメモリ管理が信頼できるかどうかを確認するために考えられる最も基本的なテストを行うことにしました。

FirstView.mxml

<?xml version="1.0" encoding="utf-8"?>
    <s:View 
        xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        title="FirstView"
        >

        <s:Button
            label="Go to child"
            click="navigator.pushView(ChildView)"
            />

</s:View>

ChildView.mxml

<?xml version="1.0" encoding="utf-8"?>
    <s:View 
        xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        title="ChildView"
        >

        <s:Button
            label="Back to home"
            click="navigator.popView()"
            />

</s:View>

それでおしまい。これ以上簡単にすることはできません。

したがって、メモリプロファイラーを使用してこれをプロファイリングしようとする場合は、次のようにします。

  1. アプリを起動し、スナップショットを撮ります
  2. 子ビューに移動して戻ってから、ガベージコレクションを実行し、スナップショットを作成します。
  3. 手順2を数回繰り返します

次に、任意の2つのスナップショットで「浮浪オブジェクトの検索」を試してみてください。最初のビューに戻った後、100を超えるオブジェクトが「浮浪」しており、チャイルドビューのすべてが破棄されているはずです。メモリ管理の観点からこれをより単純または「よりクリーン」にする方法は考えられないため、これは本当に落胆します。

これらのオブジェクトが作成され、破棄されない理由を誰かが明らかにすることはできますか?また、破壊されたビューに関連するすべてのメモリを実際に削除する、本当にクリーンなビューベースのモバイルアプリを入手するためのヒントは素晴らしいでしょう。

これまでのところ:

  • 常に弱いイベントリスナーを追加します
  • ビューを閉じるときに変数をnullに設定します(およびイベントリスナーを削除します)

ありがとうアンディ

4

1 に答える 1

1

まず、例ではオブジェクトを破棄していません。したがって、ガベージコレクションでオブジェクトを取得するために、ポインター参照が削除されていません。

次に、アプリケーションが不必要に多くのメモリを取得し続けない限り、技術的にはメモリリークではありません。私の知る限り、ビューがプッシュされるたびに新しいオブジェクトの束が作成されるのではなく、制限に達し、それだけです。

メモリが絶えず増加しているとは思いません。100個のオブジェクトがぶら下がっているので、メモリリークが発生しているとは思いません。さて、ビューをプッシュするたびに100個のオブジェクトを取得した場合、それは間違いなくメモリリークになります。

あなたがあなたの側で何か違うものを見ているかどうか私に知らせてください。:)

于 2012-06-26T03:14:26.467 に答える