3

私はライブラリに取り組んでおり、アプリケーションのメモリに問題が発生しました。

ユーザーが呼び出される関数を呼び出すことができるFileManagerというクラスを作成しました。loadNewFilesこの関数は、複数ファイル選択ダイアログを開き、各FileReferenceListをベクトルに格納します。removeListいつでも関数を呼び出して、そのリストを削除し、そのリストに割り当てられたメモリとリスナーをクリアできるので、すべて問題ありません。

UploadManagerという別のクラスを作成しました。このクラスは、 FileReferenceオブジェクトの配列を受け取り、関数を介して URL にアップロードしますuploadFiles。メモリリークはここにあるようです。この関数を呼び出すと、適切なイベント リスナーが追加され、アップロード関数が呼び出されます。アップロードが失敗するか、アップロードが完了すると、リスナーが削除され、待機していたベクトルがクリアされます。

アップロード マネージャーがファイルのアップロードを終了した後、FileManagerremoveFilesで関数を呼び出します(以前は完全に機能していたことを思い出してください) が、... 何も起こりません。ファイルは両方のベクトルから削除され、リスナーは両方のファイルから削除されますが、メモリは割り当てられたままです。ライブラリを通じて利用できるファイルやアップロードなどの数に制限がないため、これは明らかに問題を引き起こす可能性があります。

クラス:
FileManager
UploadManager

実装

4

1 に答える 1

0

あなたの例から、UploadManagerがuploadFilesに渡されたベクターからのファイルへの参照をまだ持っているか、ゲーム内の他のオブジェクトがまだ参照を持っているように聞こえます。

また、System.gc()は、フラッシュプレーヤーのデバッグバージョンでのみ機能することに注意してください。

したがって、アーキテクチャ設計の選択をそれに依存することはできません。これは、ActionScriptメモリの消費を「オンデマンド」で確認する必要がある場合に、メモリを大量に消費する操作を単体テストする場合に機能します。

本番製品では、ActionScript仮想マシンは、ガベージコレクションのタイミングと場所の検出に非常に積極的です。ほとんどの人は、あなたがそれを望まないときにそれが正しく起こると言うでしょう。

アプリケーションのプロファイリングを行い、問題のオブジェクト(つまり、FileReference)の「累積インスタンス」と「インスタンス」、および「累積メモリ」と「メモリ」を確認してみてください。

プロファイルビューで実行時にガベージコレクションを強制して、リリースバージョンでガベージコレクションが行われたときに実際に解放されるメモリの量を現実的に把握できます。

于 2013-02-05T03:49:58.250 に答える