5

簡単なプロジェクト用の NDK プロトタイプを開発しました。コードはコンパイルされ、デバイスとシミュレーターで動作します。ただし、携帯電話の設定メニューを見ると (Samsung Galaxy Nexus (Android 4.2.2)、Samsung Gio (Android 2.3.6))、Gio でアプリを実行すると、アプリを実行したときよりも多くのスペースが必要になります。ギャラクシーネクサス。また、次のコマンドは、GIO のはるかに高いヒープ割り当てを報告します。

System.out.println(Debug.getNativeHeapAllocatedSize() / 1049L);

多くの機能に静的ライブラリを使用しています。正確な結果は次のとおりです。

ネクサス:

  • フットプリント (MB) (Java 実装)1.24
  • フットプリント (MB) (C++ lib 実装)0.96
  • メモリ割り当て (MB) (Java 実装) 1.6
  • メモリ割り当て (MB) (C++ lib 実装) 1.5

ジオ:

  • フットプリント (MB) (Java 実装)1.19
  • フットプリント (MB) (C++ lib 実装)1.71
  • メモリ割り当て (MB) (Java 実装) 4.6
  • メモリ割り当て (MB) (C++ lib 実装) 5.5

このフットプリントとメモリ使用量の違いの理由は何ですか?

(iOS デバイス (C++ lib) で割り当てを測定すると、Galaxy Nexus とほぼ同じ結果が 3GS で得られます)。

4

1 に答える 1

2

Android 2.x と Android 4 には多くの違いがあります。たとえば、ビットマップ メモリの管理方法は次のとおりです。

Android Android 2.2 (API レベル 8) 以前では、ガベージ コレクションが発生すると、アプリのスレッドが停止します。これにより、パフォーマンスが低下する可能性がある遅延が発生します。Android 2.3 では、コンカレント ガベージ コレクションが追加されています。これは、ビットマップが参照されなくなった直後にメモリが再利用されることを意味します。

Android 2.3.3 (API レベル 10) 以前では、ビットマップのバッキング ピクセル データはネイティブ メモリに保存されます。これは、Dalvik ヒープに格納されているビットマップ自体とは別のものです。ネイティブ メモリ内のピクセル データは予測可能な方法で解放されないため、アプリケーションが一時的にメモリ制限を超えてクラッシュする可能性があります。Android 3.0 (API レベル 11) 以降、ピクセル データは関連するビットマップと共に Dalvik ヒープに格納されます。

引用元: http://developer.android.com/training/displaying-bitmaps/manage-memory.html

于 2013-04-19T19:01:34.933 に答える