私の CF アプリケーションには、UI 要素として多くの画像を使用して、非常にカスタマイズされた UI があります。これらのビットマップがメモリに保持されると、UI がよりスムーズに感じられます。オンデマンドで読み込まれると、UI が遅くなり、ボタンが 1 つずつ表示されるのがわかります。長い間、これはかなりうまくいきましたが、最近、アプリケーションが取得できるすべてのメモリ (32MB iirc) をほとんど使用していることに気付きました。次に、リモート パフォーマンス モニターを使用して、クリアなメモリ ホグを見つけられるかどうかを確認しました。
結局のところ、RPM を使用して GC ヒープの有用なスナップショットを取得するのは困難です。メモリ不足の例外を受け取る前に閉じてください。スナップショットを要求すると、ネイティブの例外が即座にスローされます。ただし、たまにGCスナップショットを見つけることができます。ここに 1 つ保存しました: http://files.zzattack.org/misc/ramis.gclogとここにスクリーンショット: http://files.zzattack.org/images/ramisgcsnapshot.png 私にはそれほど面倒ではないように見えます。最大のオブジェクトは、リソース ファイル (PNG 画像で約 3MB) を含むバイト配列です。全体で 3643304b (約 3.5MB) のメモリを使用しています。これらの画像は、約 20 の異なる形式で UI 要素に広がっています。個別のスレッドがメモリ使用量にどのような影響を与えるかはわかりませんが、約 5 ~ 6 個のスレッドが同時に実行されており、そのうち少なくとも 4 個が 95% の確率でブロックされた状態になっています。
プログラムで、2MB の gzip ファイルをダウンロードしようとすると、常に OutOfMemoryException が発生します。GC.GetTotalMemory(false) を呼び出すと、実際に現在使用可能な容量よりも多くを割り当てようとしていることがわかります。GC.Collect を呼び出して再試行しても、問題は「解決」/延期されません。
私の問題に対処する方法についてアドバイスをお願いします。ビットマップをメモリに保存したいのは確かですが、ビットマップに使用できるスロットの量を制限して、最も頻繁に必要とされるものだけをメモリに保持し、必要に応じて他のものをロードすることもできます。これはおそらくロングショットですが、OS にもっと多くのメモリを予約するように要求することはできますか? とにかく十分なRAMが利用可能なデバイスでのみアプリケーションが実行されることは確かです. 事前に感謝します。