Dalvikのヒープ増減について

2,427 views
Skip to first unread message

英治

unread,
Apr 20, 2011, 10:51:28 PM4/20/11
to 日本Androidの会
初めて投稿します

現在ネイティブアプリとして作成しているAndroidアプリがありまして
画像を読み込む段階で
以下のエラーが起きます

04-21 02:47:18.146: ERROR/AndroidRuntime(11021): FATAL EXCEPTION: main
04-21 02:47:18.146: ERROR/AndroidRuntime(11021):
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
04-21 02:47:18.146: ERROR/AndroidRuntime(11021): at
android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
04-21 02:47:18.146: ERROR/AndroidRuntime(11021): at
android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:450)
04-21 02:47:18.146: ERROR/AndroidRuntime(11021): at
android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:
326)
04-21 02:47:18.146: ERROR/AndroidRuntime(11021): at
android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:349)
04-21 02:47:18.146: ERROR/AndroidRuntime(11021): at
android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:375)


Dalvikヒープの上限が足らない為に起こっている現象だと思うのですが
Dalvikヒープはおそらく機種によって、最大値が違うと認識しています

Dalvik自体のメモリを増やしたり、減らしたり出来るのでしょうか?
もしできるのであれば方法を教えて頂ければと思います。

【開発環境・アプリ情報】
プラットホーム androidネイティブアプリ
開発OS Windows7
Android SDK Android 3.0 API 11 revision 1
JDK 1.6.0_24
NDK Android-ndk-r5

たろサ

unread,
Apr 23, 2011, 1:54:55 PM4/23/11
to android-g...@googlegroups.com
 たろサです。

 興味のある内容なので、Androidのソースを見てみました。メールを書こうと
思って、最後をみたら3.0だったのですね。ソース無いか・・・。

 とりあえず、v2.2.2_r1のソースを追ってみました。Dalvik自体のHeapの最大
値を増やすのは、起動オプション -Xmx, -Xmsオプションで指定すれば、増やせ
そうです。
 dalvikvm/vm/int.c
 static int dvmProcessOptions(int argc, const char* const argv[], bool
ignoreUnrecognized)
 ここで、gDvm.heapSizeStartとgDvm.heapSizeMaxがセットされていますね。デ
フォルトだと、dalvikvm/vm/int.cの
static void setCommandLineDefaults()に、
/* Defaults overridden by -Xms and -Xmx.
* TODO: base these on a system or application-specific default
*/
gDvm.heapSizeStart = 2 * 1024 * 1024; // Spec says 16MB; too big for us.
gDvm.heapSizeMax = 16 * 1024 * 1024; // Spec says 75% physical mem

と書かれていますね。 ↑#defineしてないんかい!

 で、アプリを起動するときのheap確保は、
dalvik/vm/alloc/HeapSource.c
static bool addNewHeap(HeapSource *hs, mspace msp, size_t
mspAbsoluteMaxSize)
でやっていると思うのですが、アプリをforkするときはmsp==NULLで着ていると
思うのです。
 そうすると、
heap.absoluteMaxSize = hs->absoluteMaxSize - overhead;
heap.msp = createMspace(HEAP_MIN_FREE, heap.absoluteMaxSize, hs->numHeaps);
 となっているので、heapのメモリスペースがHEAP_MIN_FREE固定で確保されま
す。overheadというのは、たぶん、既に別アプリが確保したメモリです。

 で、ここまで書いて、私の解釈ですが、アプリはdalvikvmが確保した1つのメ
モリを使いあっているのではないかと思います。ただし、親プロセスである
ZygoteのヒープはCGしないフラグ?数値?がビットマップにあるので、ここはア
プリは使わない。

 なので、アプリごとに使うピープを指定することはできないような気がします。
 すいません、より、詳しい方のフォローをお願いします。 

--
山本三七男 (Minao Yamamoto) ---------------- ハンドル:たろサ -----
E-Mail: taro...@gmail.com

大垣憲俊

unread,
May 8, 2011, 10:32:18 AM5/8/11
to android-g...@googlegroups.com
大垣です。

いわばハッキングレベルの話ですが、/system/build.prop ファイル中の「dalvik.vm.heapsize=32」の32を増減させるという方法があります。

http://d.hatena.ne.jp/atsurin/20110507/1304773419


Reply all
Reply to author
Forward
0 new messages