Androidアプリケーションのヒープサイズを増やす方法


125

複数の3Dモデルを使用するAndroidアプリケーションを作成しています。このようなテクスチャのあるモデルは、大量のメモリを消費する可能性があります。メーカーがアプリケーションが使用できるヒープサイズに制限を設定していることがわかりました。たとえば、私のタブレットのSamsung Galaxy Tab 8.9 P7310は64MBのメモリを占有できます。

アプリケーションが使用できるこのメモリサイズを増やす方法はありますか?

回答:


210

android:largeHeap = "true"を使用できますをて大きなヒープサイズをリクエストが、これはHoneycomb以前のデバイスでは機能しません。2.3より前のデバイスでは、VMRuntimeクラスを使用できますが、これはGingerbread以上では機能しません。

NDKはSDKのようにメモリ制限を課さないため、制限をできるだけ大きくする唯一の方法は、NDKを介してメモリを集中的に使用するタスクを実行することです。

または、現在表示されているモデルの部分のみをロードし、残りを必要に応じてロードする一方で、未使用の部分をメモリから削除することもできます。ただし、アプリによっては、これができない場合があります。


NDKは面白そうだ。SDKで既に記述されているコードと組み合わせて使用​​できますか?
cooxie 2012年

3
それはあなたが持っているコードに完全に依存します。私はNDKの専門家ではなく、基本のみを知っています。この質問は、android-ndk Googleグループでコードの説明と一緒に質問するか、android-ndkタグを使用して、SOに新しい質問を投稿することをお勧めします。
Raghav Sood 2012年

Unity3Dを質問へのより具体的な回答として「単純に」使用できないのか(「複数の3Dモデルを使用」)... UnityがNDKを使用しているかどうかに関する明確な証拠をすぐに見つけることができませんでした。
cregox 2015年

3
largeHeap=trueFTW
Luis Artola

2
Android APIの開発者は本当におもしろいです。もっとヒープが欲しいみたいです。OKリクエストしてください、それはそれを必要とする人のためだけです...その間、すべての開発者はアプリが製品化されたときに最初に追加するものとしてそれを追加します:)
AndroidLover

110

アプリケーションが使用できるこのメモリサイズを増やす方法はありますか?

APIレベル11+上で動作しているアプリケーションは持つことができるandroid:largeHeap="true"<application>、より大きな通常よりもヒープサイズを要求するために、マニフェストの要素、そしてgetLargeMemoryClass()上のActivityManagerヒープがあることをどのように大きなを教えてくれます。しかしながら:

  1. これは、APIレベル11以上(つまり、Honeycomb以降)でのみ機能します。

  2. 大きなヒープの大きさは保証されていません

  3. ユーザーは大きなヒープリクエストを認識します。これは、他のアプリのRAMを強制的に終了させるため、他のアプリのプロセスを終了して、システムRAMを解放して大きなヒープで使用できるようにするためです。

  4. #3、およびそれandroid:largeHeapが悪用されることを期待しているという事実のため、これに対するサポートは将来的に中止されるか、インストール時にユーザーにこれについて警告される可能性があります(たとえば、特別な許可を要求する必要があります) )

  5. 現在、この機能は簡単に文書化されています


largeCommonsWareにlargeHeapがない場合、以前にロードしたオブジェクト(画像など)を削除するにはどうすればよいですか?
ジョンベブ2013

@MiguelRivera:画像の場合、理想的にはあなたが(参照、そのメモリをリサイクルinBitmapBitmapOptions)。さらに、それらへの参照をすべて削除すると、最終的にはガベージコレクションされます。
CommonsWare 2013

そして、あなたはどのような決定を提案しますか?
Gennadiy Ryabkin 2014年

@zest:ごめんなさい。
CommonsWare 2014年

2
@Eftekhari:直接ではなく、アプリ用です。より多くのものを持っていると、そのものを処理するのに多くのCPU時間を費やす可能性がありますが、その詳細はメモリで何をしているかによって異なり、リクエストしたこととは直接関係しませんandroid:largeHeap。ただし、大きなヒープを要求すると、他のアプリケーションプロセスが本来必要とするよりも早く終了するため、ユーザーエクスペリエンス全体に悪影響を与える可能性があります。
CommonsWare 2016

22

ヒープサイズを動的に増やすことはできません。

android:largeHeap="true"マニフェストでを使用して、さらに使用するように要求できます。

また、あなたは使うことができます native memory (NDK & JNI)、実際にはヒープサイズの制限を回避。

これについて私が作成したいくつかの投稿があります:

そして、ここに私が作成したライブラリがあります:


@アプリごとのJavaレベルでのヒープ制限とネイティブは異なりますか?つまり、s5 devcieでの例128メガバイトのJavaヒープ制限とネイティブは、さらに128メガバイトかかる可能性がありますか?
NitZRobotKoder

ヒープサイズはアプリごとに一定であり(サイズはハードウェアとromによって異なります)、すべてのアプリで同じにする必要があります。ネイティブメモリは実際のデバイスの1つですが、OSによって使用されるため、もちろん制限されています。
Android開発者

私のアプリがネイティブの.so + java androidプラットフォーム+ java POJOロジック+ JavaScriptを使用している場合を意味しました。アンドロイドは各レベルで異なるヒープサイズを持っていますか?
NitZRobotKoder


@NitZRobotKoderいいえ。ヒープサイズはJava / Kotlinの世界用であり、使用しすぎるとOOM例外が発生する可能性があります。残りの部分は、ネイティブメモリです。
android開発者

6

2番目のプロセスを使用します。でAndroidManifest新しいServiceと宣言する

android:process=":second"

最初と2番目のプロセス間の交換 BroadcastReceiver


5

これは、Android OSに応じて2つの方法で実行できます。

  1. 使用できます android:largeHeap="true"Androidマニフェストのアプリケーションタグでして、より大きなヒープサイズを要求が、これはHoneycomb以前のデバイスでは機能しません。
  2. 2.3より前のデバイスではVMRuntimeクラスを使用できますが、これはGingerbread以上では機能しません。以下の方法を参照してください。
VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);

HeapSizeを設定する前に、他のアプリケーションやOSの機能に影響を与えない適切なサイズを入力したことを確認してください。設定する前に、アプリのサイズを確認し、ジョブを実行するためにサイズを設定してください。あまり多くのメモリを使用しないでください。そうしないと、他のアプリが影響を与える可能性があります。

リファレンス:http : //dwij.co.in/increase-heap-size-of-android-application


4
明らかに、<2.3には方法があり、> 2.3には方法がありますが、2.3はねじ込まれています!
マイケル

3

私が覚えていることから、あなたは使うことができました VMRuntime、初期のAndroidバージョンでクラスをましたが、今ではもう使用できません。

ただし、モバイル環境で開発者にヒープサイズを選択させることは、それほど安全とは言えません。アプリケーション自体から変更しようとするよりも、(プログラミング側ではなく)特定のデバイスでヒープサイズを変更する方法を見つける方が簡単だと思います。


0

Javaヒープの増加は、モバイルの赤字の回復を不当に食べます。場合によっては、ガベージコレクター待機し、ヒープ領域が減少した後で操作を再開するだけで十分な場合があります。次に、この静的メソッドを使用します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.