4

16MB のメモリが "予約" されているアプリケーションについて読んだことがあります。少なくとも、デバイスによってはそれ以上になる可能性がありますが、開発者としてこれを期待する必要があります.

2.2 froyo までサポートしているため、多くのデバイスはハイエンド デバイスではありません。Logcat に次のようなメッセージが表示されます。

03-29 14:08:51.570: I/dalvikvm-heap(19899): Grow heap (frag case) to 13.624MB for 200765-byte allocation

気になるのは13MB。16MB に達した場合にアプリがクラッシュするかどうかはわかりません。一部のコードの最適化を真剣に検討する必要がありますか?

4

2 に答える 2

6

Android のメモリ管理はそれほど簡単ではないため、メモリ使用量に関しては常に可能な限り低く抑える必要があります。

各 Android デバイスで使用できるメモリの量は限られています。ほとんどの場合、これは画面サイズ、CPU の計算能力、およびその他の要因に関連しています (3D 画面では場合によっては 2 倍のメモリが必要になるなど)。Nexus One には 32 MB、Galaxy Nexus には 64 MB、タブレットにはさらに多くの容量があります。最大ヒープ サイズはシステム設定で変更できます。Cyanogen Mod を使用すると、非常に簡単に調整できます。

古い Android (2.3 より前?) では、このメモリ制限は、標準 (通常のオブジェクト、UI、文字列など) とマルチメディア (画像、オーディオ バッファー、OpenGL のもの、カメラ フレーム) の 2 つの部分に分割されていました。Android 2.2 を搭載した Nexus One には 16MB/16MB のヒープがあり、16MB の画像と 100KB の UI を読み込んで単純なギャラリーを表示するアプリをクラッシュさせる可能性があるため、非常にイライラすることがありました。

一部のデバイスでは、大きすぎるメモリ ブロックを割り当てることができません。たとえば、Galaxy Nexus には 31.9999MB の制限があります。また、割り当てようとしているメモリの連続ブロックが大きいほど、システムがそのような割り当てを完了するのに必要な時間が長くなります。そのような大きなメモリブロックを見つけるには、いくつかのものを再割り当てする必要があります。

新しい Android には、大量のメモリを提供する largeHeap フラグがあります。通常は通常の約5倍です。良さそうに聞こえますが、ラージヒープの使用はお勧めしません (デバッグを除く)。基本的に、システムはそれ自体のためにいくらかのメモリを必要とします。必要以上に取得すると、Android は、最近使用されていないアプリから順に、予告なしにアプリを強制終了します。

ガベージ コレクターは、システムのバージョンと実装によって異なる戦略を持つ場合があります。Nexus One のストック Android 2.3 (おそらく) は非常にアグレッシブだったため、13 MB を超えるイメージを割り当てることができませんでした。多くのメモリが空いているように見えるかもしれませんが、突然ブーム - アプリがダウンしています。

ネイティブメモリを使用できます。各 Android アプリは (多かれ少なかれ) Linux プロセスであり、直接 malloc 呼び出しを使用してメモリを割り当てることができます。JNI と C コードが必要ですが、それを使用すると、メモリ全体にアクセスして、好きなことを行うことができます。繰り返しになりますが、空きメモリの量が少なくなりすぎると、システムがアプリを強制終了することに注意してください。

複数のプロセスを使用してアプリを分割し、メモリの使用をそれらの間で分割できます。それほど便利ではありませんが、機能し、一部のライブラリはそれを使用して、一見可能であるはずのリソースよりも多くのリソースを取得します。

それを除いて、一部のオブジェクトはあなたが思っているよりも多くのメモリを使用する可能性があることを覚えておく必要があります。たとえば、ハードウェア アクセラレーションは少し注意が必要です。ほとんどのデバイスは、2 のべき乗でないサイズのテクスチャをサポートしていません。これは、ImageView (300x50px) とハードウェア アクセラレーションが有効になっている場合、Android が ImageView に 512x64px のテクスチャを割り当てることを意味します。すべてが OpenGL によって描画され、テクスチャが必要なためです。このようなテクスチャを使用すると、ImageView は、ハードウェア アクセラレーションがない場合に比べて最大 2.5 倍のメモリを消費します。また、View がアニメーション化されている場合、Android はアニメーション フレームごとにテクスチャを再構築する必要があります。

要約すると、メモリ管理に関しては、Android は扱いにくい場合があります。場合によっては大量のメモリが必要になることがあるため (たとえば、ギャラリーの作成時)、より大きな値に成長するヒープは間違っていない可能性があります。アプリのメモリ使用量に影響を与える可能性のあるさまざまな要因があることを認識し、できるだけ低く抑えるようにしてください。

于 2013-03-29T14:39:41.173 に答える
0

本当に毎回同じエラーが発生する場合、最善の方法はヒープ サイズを増やすことです。また、ヒープ サイズを増やすのは非常に簡単です。

他のサービスには影響しません。.iniEclipse が保存されているファイルのヒープ サイズを増やします。

于 2013-04-01T05:29:14.563 に答える