2010-11-18 3 views
3

私の質問は素朴に見えるかもしれませんが、私はそれをより正しく定式化する方法を知らないのです。問題は、アプリケーションで大きなシンプルな型の配列を作成して使用することです。そして、私のようなエラーが出:私のアプリケーションのヒープメモリが他のアプリケーションより少ないのはなぜですか?

ERROR/dalvikvm-heap(1763): Out of memory on a 7907344-byte allocation. 

はい、それは十分な大きさだが、同じ時間の使用の50メガバイトの他、さらには110メガバイトは(かつて見たことがある)しながら、タスク管理ツールは、私のアプリケーションはメモリののみ30メガバイトを使用していると主張し、システムに190MBの空きメモリがあります(システムアプリケーションではなく、私がインストールした他の通常のアプリケーションだけです)。起動時にすべてのアプリケーションが同じヒープサイズで提供されている場合、どのように大きく成長できますか?

+7

おそらく、十分に大きな連続したメモリを見つけることに問題があります。 – Anthony

+0

なぜ最初からあまりにも多くを割り当てたいのですか?私に推測させてください:バッファリングされていないストリーム – apps

+0

私はそれをキャンバスにdrawBitmapに使用します。その理由は、JNIがアクセスするネイティブコードでビットマップが生成され、常に変更されるためです。 –

答えて

4

Androidアプリケーションの最大ヒープサイズは、実行中のデバイスによって異なります。初期のデバイスの場合、最大ヒープサイズは16MBでしたが、それ以降のデバイスでは24MB、場合によっては32MBまで可能です。

これは各デバイスのDalvik VMのプロパティであり、変更することはできません(Androidをソースから再構築することはありません)。

ActivityManager.getMemoryClass()で「アプリケーションごとのメモリクラス」を照会することができます。これは、ヒープサイズとは完全に関係のない数字であるようです。

アプリケーションはヒープにはないメモリを使用できますが、100 + MBは驚くほど大量のようです。

Androidのメモリ使用量の分析については、GoogleのAndroid開発者の1人であるthis Stack Overflow answer by Dianne Hackbornよりも優れているとは限りません。要するに、メモリの使用状況を分析することは非常に難しく、あなたは塩のピンチであなたが持っている任意の数字を取る必要があります。

-1

ヒープサイズを設定しようとしましたか?これを行うには、次のオプションを使用します。 Javaの-Xms20m -xMX100m -cp:

-Xmsは初期のJavaヒープサイズ -Xmxは、より多くの助けの実行に のjava -X

例を得るために最大のJavaヒープサイズに

を設定する設定しました。マイメイン

幸運。

-1

Javaはデフォルトでガベージコレクタシステムを持っていますが、あるレベルでは何らかのオブジェクトをクリアまたはフラッシュする必要があります。

また、JVMのヒープサイズを設定または構成することもできます。