0

私の 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が利用可能なデバイスでのみアプリケーションが実行されることは確かです. 事前に感謝します。

4

3 に答える 3

1

複数のフォームで同じ画像を使用している場合は、それらのビットマップを、すべてのフォームからアクセスできるクラスの静的変数として保持することを検討する必要があります。

public class AppBitmaps
{
  public static Bitmap LogoBitmap = new Bitmap(...);

  public static Bitmap ButtonBitmap = new Bitmap(...);
}

public class Form1
{
  public Form1()
  {
    this.Control1.Image = AppBitmaps.LogoBitmap;
  }
}

そうすれば、そのイメージのインスタンスを 1 つだけメモリに保持できるため、全体的なメモリ使用量が削減されます。

于 2010-01-11T14:29:01.947 に答える
0

「RPM を使用して GC ヒープの便利なスナップショットを取得するのは難しい」 .NET CF 用のプロファイラーを試すことができるかもしれません。それがスレッドに役立つ場合は、EQATEC プロファイラーについて聞いたことがあります。

OOM エラーを回避するための私のアプローチは、MDI (Multiple Document Interface) タイプのアプリケーション用に設計せず、メモリ内に 1 つのフォームしか持たず、使用後にすべてのオブジェクト (特に XMLDocument のような「重いもの」) を null に設定することです。

また、これは関連する可能性があります: CF.NET で大きなビットマップを作成するときの OutOfMemoryException

于 2010-01-11T12:35:31.493 に答える
0

それがあなたのアプリケーションが完全に動作しているスナップショットである場合は、次のことをお勧めします。

  • 実行中の別のアプリです
  • アプリがアンマネージ メモリ リークを引き起こしている可能性があります
  • OS(カスタマイズされたCE?)にリークがあります
  • または、他の何か
于 2010-01-12T00:41:17.720 に答える