web-dev-qa-db-ja.com

Androidのビットマップ

ビットマップオブジェクトとメモリ、およびそれらの一般的な分類法についていくつか質問があります。

  1. インメモリまたはネイティブビットマップとは何ですか?
  2. ビットマップメモリ​​とヒープメモリの違いは何ですか?
29
Samuh

Bitmapオブジェクトをサポートするメモリは、Java newキーワードではなく、ネイティブコード(malloc())を使用して割り当てられます。これは、メモリが管理されることを意味しますDalvikではなく、OSによって直接。

ネイティブヒープとDalvikのヒープの本当の違いは、Dalvikのヒープはガベージコレクションされ、ネイティブヒープはそうでないことです。

ただし、これらの目的では、それほど大きな違いはありません。 Bitmapオブジェクトがガベージコレクションされると、デストラクタがネイティブヒープ内の関連するメモリをリサイクルします。

ソース:

33
Trevor Johns

ここには重要な微妙な点があります。ビットマップピクセルはネイティブヒープに割り当てられますが、Dalvikのいくつかの特別なトリックにより、Javaヒープに対して考慮されます。これは2つの理由で行われます:

(1)アプリケーションがこれを割り当てるメモリの量を制御します。アカウンティングなしでは、アプリケーションは、16MBまたは24MBのヒープ制限を超えて拡張する、大量のメモリを割り当てる可能性があります(Bitmapオブジェクト自体は非常に小さいが、任意の大量のネイティブメモリを保持できるため)。

(2)いつGCするかを決定するため。アカウンティングがなければ、たとえば100個のビットマップオブジェクトに参照を割り当てて解放することができます。これらのオブジェクトは小さいため、GCは実行されませんでしたが、実際には、現在メガバイト単位で大量の割り当てが行われているため、適時にGCされていません。 Javaヒープに対してこれらの割り当てを考慮することにより、ガベージコレクターは、メモリが使用されていると見なして実行されます。

多くの点で、これは実装の詳細であることに注意してください。これらは両方ともビットマップ割り当てを管理するための重要な特性であるため、この基本的な動作は何らかの形で残りますが、将来的には変更される可能性が非常に高くなります。

32
hackbod

実際の展開から、私は次のデバイスを見つけました:

  • Javaヒープ)の16 MiBに制限するデバイス(ビットマップはほぼ無制限です)。
  • (Javaヒープ+ネイティブビットマップストレージ)の16 MiBに制限されるデバイス
  • Javaヒープ)の24 MiBに制限するデバイス(ビットマップはほぼ無制限です)。
  • 24 MiB(Javaヒープ+ネイティブビットマップストレージ)に制限されるデバイス

24 MiBは高解像度デバイスになる傾向があり、Runtime.getRuntime()。maxMemory()で検出できます。現在32MiBデバイスもあり、根ざした電話の一部にはデフォルトで64MiBがあります。以前は、何が起こっているのかを理解しようとして自分を何度か混乱させていました。すべてのデバイスがビットマップをヒープ制限にカウントすると思います。しかし、Androidフリートについて広範な一般化を行うことは非常に困難です。

これはAndroidで非常に厄介な問題であり、非常に混乱します。この制限とその動作は十分に文書化されておらず、複雑で、非常に直感的ではありません。また、デバイスやOSのバージョンによって異なり、いくつかの既知のバグがあります。問題の一部は、制限が正確でないことです。ヒープの断片化により、実際の制限のかなり前にOOMにヒットし、控えめに1メガまたは2バッファーを残す必要があります。さらに悪いことに、ネイティブのセグメンテーションフォールト(Android自体のバグ100%)が発生する前に発生するデバイスがいくつかありますJava OOM例外です。ネイティブクラッシュをキャッチすることさえできないため、制限に決して到達しないことが二重に重要です。私の調査の詳細については、 この投稿 をチェックしてください。同じ投稿で、制限に対して使用量を測定し、クラッシュを回避します。

Javaヒープのサイズは、Runtime.getRuntime()。totalMemory()です。

ネイティブのビットマップストレージのサイズを簡単に測定する方法はありません。ネイティブヒープ全体はDebug.getNativeHeapAllocatedSize()で測定できますが、ビットマップのみが制限に向かってカウントされます(私は思う)。

12
Dave Dopson