2011-08-30 1 views
23

私は、インターネットから音楽をストリーミングするアプリを開発しています...私のアプリは多くのことを行い、このように構成されています。タブビューがあり、すべてのビューが毎回メモリに割り当てられます私はタブをナビゲートする私は前の状態(すべてのタブもインターネット上の曲、ニュースなどの情報を見つけるためにWebビューを開くことができます)を見つける..すべてのメモリ占領を成長させるが、アプリを非常にユーザーフレンドリーにする...注意を払った後Androidのガイドに従ってメモリリークが発生するのを避けるため、ヒープ占いを調べようとしましたが、私のアプリは最大3.5MBのメモリを割り当て、割り当てられたヒープサイズは4.5〜4.6 MBです...私はエミュレータで作業しています。彼らはそんなに思っているわけではありませんが、LogCatで奇妙なメッセージを作成して再起動することがあります。Android Grow heap frag case

Grow heap (frag case) to 3.373 for 19764-byte allocation 

この意味は?エミュレータの問題?または、他の何か?あまりにも多くのメモリを使用していますか?

は、任意の助けを事前にいただきありがとうございます:)

答えて

35

を最大ヒープサイズは、(あなたがRuntime.getRuntime().maxMemory()を呼び出して、その値を取得することができます)、デバイスに依存しますが、それは32メガバイトの周りに、おそらくです。メモリを節約するために、Androidはすべてのアプリに自動的に最大のメモリを割り当てません。代わりに、アプリがより多くのメモリを必要とするまで待ってから、必要に応じてヒープスペースを最大にするまでヒープスペースを増やします。私はそれがあなたが見るGrow heapメッセージだと思います。

多くのメモリを割り当てて解放すると、断片化の問題が発生する可能性があります。 Wikipediaの説明はhereですが、基本的には、必要なメモリが1つのチャンクにすべて入っているわけではありません。したがって、ヒープを成長させる必要がある。

あなたの質問に答えるには、おそらくエミュレータの問題ではなく、ちょうどあなたのプログラムの性質であり、少しメモリが重く聞こえるでしょう。しかし、これは悪いことではありません。私はwebviewsと複数のタブの3-5メガバイトを使用してあまりにも多すぎるとは思わない。

+0

回答ありがとう^^なぜ悪いことではないのですか?これが起こると私のアプリは終了する...私はこれが悪いと思う...私のせい?私は別のメッセージを受け取ります:heapworkerは詰まっています:13129msはLandroid/media/MediaPlayerの内部で過ごしました; .finalize()V ...これは何ですか? – Erenwoid

+0

ええ、あなたのアプリが終了している場合、それは悪いです。私は〜4MBのヒープを複数のWebページに使用することは悪くないことを意味します。 私はHeapWorkerの問題についてあまり気にしません。通常、割り当てられたメモリを追跡し、未使用のオブジェクトに対してガベージコレクタを実行します。私の推測では、あなたのスレッドの1つがすべてのCPUを使用しており、 'MediaPlayer'に' finalize() 'を実行する時間が与えられていないということです。これは13秒かかるはずの関数です。 –

関連する問題