3

約 0.1 MB の増加が予想されるときに、ネイティブ ヒープの使用量が 6 MB 増加します。

これらの数字にたどり着いた方法:

Log.d("test", "before setting layout");
showMemoryStats();

setContentView(R.layout.my_layout);

Log.d("test", "after setting layout");
showMemoryStats();

showMemoryStats の場所:

public static void showMemoryStats() {
    Log.i("test", "----------------------------------------------------------------------------------------------------------------------------");
    Log.i("test", "showing memory stats in xx");
    double nativeUsage = Debug.getNativeHeapAllocatedSize(); 
    Log.i("test", "nativeUsage: " + nativeUsage);
    //current heap size 
    double heapSize =  Runtime.getRuntime().totalMemory();
    Log.i("test", "heapSize: " + heapSize);
    //amount available in heap 
    double heapRemaining = Runtime.getRuntime().freeMemory();   
    Log.i("test", "heapRemaining: " + heapRemaining);
    double memoryAvailable = Runtime.getRuntime().maxMemory() - (heapSize - heapRemaining) - nativeUsage;
    Log.i("test", "memoryAvailable: " + memoryAvailable);
    Log.i("test", "----------------------------------------------------------------------------------------------------------------------------");
}

出力:

07-03 16:50:40.127: D/test(18647): レイアウト設定前

07-03 16:50:40.127: 私/テスト (18647): ---------------------------------- -------------------------------------------------- --------------------------------------------

07-03 16:50:40.127: I/test(18647): xx でメモリ統計を表示しています

07-03 16:50:40.127: 私/テスト (18647): ネイティブ使用法: 5706008.0

07-03 16:50:40.127: 私/テスト (18647): ヒープサイズ: 4905968.0

07-03 16:50:40.127: 私/テスト (18647): heapRemaining: 1815456.0

07-03 16:50:40.127: 私/テスト (18647): memoryAvailable: 2.4757912E7

07-03 16:50:40.127: 私/テスト (18647): ---------------------------------- -------------------------------------------------- --------------------------------------------

07-03 16:50:40.348: D/dalvikvm(18647): GC_EXTERNAL_ALLOC が 100K を解放、49% が 2924K/5639K、外部 0K/0K、一時停止 45ms

07-03 16:50:40.518: D/dalvikvm(18647): GC_EXTERNAL_ALLOC は 9K を解放し、49% は 2917K/5639K を解放し、外部は 2700K/3371K を一時停止しました。

07-03 16:50:40.638: D/dalvikvm(18647): GC_EXTERNAL_ALLOC が 4K を解放、2928K/5639K が 49% 解放、外部 3952K/4356K、一時停止 51ms

07-03 16:50:40.698: D/dalvikvm(18647): GC_EXTERNAL_ALLOC は 2K を解放し、48% は 2933K/5639K を解放し、外部は 5963K/6027K を一時停止しました。

07-03 16:50:40.718: D/test(18647): レイアウト設定後

07-03 16:50:40.718: 私/テスト (18647): ---------------------------------- -------------------------------------------------- --------------------------------------------

07-03 16:50:40.718: I/test(18647): xx でメモリ統計を表示しています

07-03 16:50:40.718: 私/テスト (18647): ネイティブ使用法: 1.2101904E7

07-03 16:50:40.718: 私/テスト (18647): ヒープサイズ: 4734944.0

07-03 16:50:40.718: 私/テスト (18647): heapRemaining: 1716432.0

07-03 16:50:40.718: 私/テスト (18647): memoryAvailable: 1.8434016E7

07-03 16:50:40.718: 私/テスト (18647): ---------------------------------- -------------------------------------------------- --------------------------------------------

数学:

12101856 バイト - 5703424 バイト = 6398432 バイト = 6.10202 メガバイト

レイアウト ファイルを調べて、使用するすべてのドローアブルのサイズを追加したところ、合計サイズは 124 kb -> 0.121094 mb になりました。

では、一体何がネイティブ ヒープを 6 MB 増加させているのでしょうか。

誰かがそれを求めた場合、それが理にかなっているのかどうかわかりません... IDとドローアブルを含むレイアウトの束だけで、すでにドローアブルのサイズを確認しました。

事前にどうもありがとう...

編集:私の場合、これが解決策でした-応答とコメントを要約するために:「drawable」フォルダーに画像を保存し、hdpiデバイスを使用していました。解決策: 画像をフォルダー drawable-hdpi に入れます。理由: システムは、既に hdpi 解像度になっているにもかかわらず、hdpi 解像度に一致させるために、"drawable" からイメージを引き伸ばしていました。これにより、本来の 2 倍以上のメモリを占有していました。

4

2 に答える 2

1

問題は、Androidが画面に描画可能なものを描画する必要がある場合、それらがresフォルダーにある場合よりもはるかに大きくなることです。たとえば、100 KbのPNGがある場合、これは圧縮サイズです。androidが画面にPNGを描画すると、デフォルトの通常のサイズ(4バイト)*(高さ(ピクセル))*(幅(ピクセル))に拡大されます。これは、画像のピクセルごとに4バイトの色情報が格納されるためです。これは、画像がたとえば800 x 600ピクセルの場合、Androidが生成する結果のビットマップは800x600x4バイト=1920000バイト=2Mbに近いことを意味します。

この問題を回避したい場合は、小さい画像を使用する必要があります。

于 2012-07-03T15:53:21.323 に答える
1

ええと、ビットマップは膨大なスペースを占有します。

各ピクセルには4バイトが必要です。

つまり、1Mピクセルの画像は4MBです!!! 小さい画像をたくさん使っていると思いますが、すぐに増えてしまいます。

これを回避する1つの方法は、ビットマップを低解像度でロードすることです(とにかく最大解像度で表示されないため、ほとんどの場合、違いに気付くことはありません)。これを調べてくださいBitmapFactory.Options.inSampleSize

アンドロイドから引用したように

ビットマップは、特に写真のようなリッチな画像の場合、多くのメモリを消費します。たとえば、Galaxy Nexusのカメラは、最大2592x1936ピクセル(5メガピクセル)の写真を撮影します。使用されるビットマップ構成がARGB_8888(Android 2.3以降のデフォルト)の場合、このイメージをメモリにロードするには約19MBのメモリ(2592 * 1936 * 4バイト)が必要であり、一部のデバイスではアプリごとの制限をすぐに使い果たします。

これはそれをよりよく説明するための素晴らしいリンクです

于 2012-07-03T15:53:53.820 に答える