Wie kann man die Heap-Größe einer Android-Anwendung erhöhen?

125

Ich schreibe eine Android-Anwendung, die mehrere 3D-Modelle verwendet. Ein solches Modell mit Texturen kann viel Speicherplatz beanspruchen. Ich habe herausgefunden, dass der Hersteller die Heap-Größe, die eine Anwendung verwenden kann, begrenzt. Zum Beispiel kann mein Tablet Samsung Galaxy Tab 8.9 P7310 64 MB Speicher belegen.

Gibt es eine Möglichkeit, diese Speichergröße zu erhöhen, die eine Anwendung verwenden kann?

cooxie
quelle

Antworten:

210

Sie können android: largeHeap = "true" verwenden , um eine größere Heap-Größe anzufordern. Dies funktioniert jedoch nicht auf Geräten vor Honeycomb. Auf Geräten vor Version 2.3 können Sie die VMRuntime-Klasse verwenden, dies funktioniert jedoch nicht mit Gingerbread und höher.

Die einzige Möglichkeit, ein möglichst großes Limit festzulegen, besteht darin, speicherintensive Aufgaben über das NDK auszuführen, da das NDK keine Speicherlimits wie das SDK festlegt.

Alternativ können Sie nur den Teil des Modells laden, der gerade angezeigt wird, und den Rest nach Bedarf laden, während Sie die nicht verwendeten Teile aus dem Speicher entfernen. Dies ist jedoch je nach App möglicherweise nicht möglich.

Raghav Sood
quelle
NDK sieht interessant aus. Könnte ich es in Kombination mit meinem Code verwenden, der bereits mit SDK geschrieben wurde?
Cooxie
3
Das hängt ganz davon ab, welchen Code Sie haben. Ich bin kein Experte im NDK und kenne nur die Grundlagen. Ich würde empfehlen, dass Sie diese Frage zusammen mit einer Beschreibung Ihres Codes in der Android-ndk-Google-Gruppe stellen oder eine neue Frage zu SO spezifisch für diese mit dem android-ndk-Tag posten.
Raghav Sood
Ich frage mich, ob wir Unity3D nicht "einfach" als spezifischere Antwort auf die Frage verwenden können ("verwendet mehrere 3D-Modelle") ... Es konnten nicht schnell eindeutige Beweise dafür gefunden werden, ob Unity NDK verwendet.
Cregox
3
largeHeap=trueFTW
Luis Artola
2
Die Entwickler von Android API sind wirklich lustig, sie sind wie Sie wollen mehr Heap? Ok, fordern Sie es an, es ist nur für diejenigen, die es brauchen ... währenddessen fügt jeder Entwickler es als erstes hinzu, wenn die App zur Produktion kommt :)
AndroidLover
110

Gibt es eine Möglichkeit, diese Speichergröße zu erhöhen, die eine Anwendung verwenden kann?

Anwendungen, die auf API Level 11+ ausgeführt werden, können android:largeHeap="true"über das <application>Element im Manifest verfügen , um eine über dem Normalwert liegende Heap-Größe anzufordern, und getLargeMemoryClass()on ActivityManagerzeigt an, wie groß dieser Heap ist. Jedoch:

  1. Dies funktioniert nur auf API Level 11+ (dh Honeycomb und höher).

  2. Es gibt keine Garantie dafür, wie groß der große Haufen sein wird

  3. Der Benutzer nimmt Ihre Anforderung eines großen Heaps wahr, da dadurch die anderen Apps aus dem RAM gezwungen werden, die Prozesse anderer Apps zu beenden, um den System-RAM für die Verwendung durch Ihren großen Heap freizugeben

  4. Aufgrund von Nummer 3 und der Tatsache, dass ich davon ausgehe, dass android:largeHeapdies missbraucht wird, wird die Unterstützung möglicherweise in Zukunft eingestellt oder der Benutzer wird bei der Installation darüber gewarnt (z. B. müssen Sie eine spezielle Berechtigung dafür anfordern )

  5. Derzeit ist diese Funktion nur geringfügig dokumentiert

CommonsWare
quelle
@CommonsWare Wie kann ich zuvor geladene Objekte (wie Bilder) entfernen, wenn kein LargeHeap verfügbar ist?
Jeongbebs
@ MiguelRivera: Für Bilder recyceln Sie idealerweise deren Speicher (siehe inBitmapweiter BitmapOptions). Entfernen Sie darüber hinaus alle Verweise auf sie, und schließlich werden sie mit Müll gesammelt.
CommonsWare
und welche entscheidung schlägst du vor
Gennadiy Ryabkin
@zest: Ich weiß nicht, worauf Sie sich beziehen, sorry.
CommonsWare
2
@Eftekhari: Nicht direkt für deine App. Wenn Sie mehr Material haben, müssen Sie möglicherweise mehr CPU-Zeit damit verbringen, dieses Material durchzuarbeiten. Die Details dort hängen jedoch davon ab, was Sie mit dem Speicher tun, und sind nicht direkt an die Anforderung gebunden android:largeHeap. Das Anfordern eines großen Heaps kann jedoch die Benutzererfahrung insgesamt beeinträchtigen, indem andere Anwendungsprozesse gezwungen werden, früher zu beenden, als dies sonst erforderlich gewesen wäre.
CommonsWare
22

Sie können die Heap-Größe nicht dynamisch erhöhen.

Sie können die Verwendung von mehr android:largeHeap="true"im Manifest anfordern .

Sie können auch verwenden native memory (NDK & JNI), sodass Sie die Beschränkung der Heap-Größe tatsächlich umgehen.

Hier sind einige Beiträge, die ich darüber gemacht habe:

und hier ist eine Bibliothek, die ich dafür gemacht habe:

Android-Entwickler
quelle
@ pro App begrenzt Heap auf Java-Ebene und native ist anders? zB Beispiel auf s5 devcie 128mb Java-Heap-Limit und native kann weitere 128mb nehmen?
NitZRobotKoder
Die Heap-Größe ist für jede App konstant (Größe hängt von Hardware und ROM ab) und sollte für alle gleich sein. Der native Speicher ist der eigentliche Speicher des Geräts, aber natürlich auch begrenzt, da ein Teil davon vom Betriebssystem verwendet wird.
Android-Entwickler
Ich meinte, wenn meine App sagen native .so + Java Android Platform + Java POJO Logik + JavaScript verwendet. Hat Android auf jeder Ebene eine andere Heap-Größe?
NitZRobotKoder
@NitZRobotKoder Nein. Die Heap-Größe gilt für die Java / Kotlin-Welt, in der Sie OOM-Ausnahmen erhalten können, wenn Sie zu viel verwenden. Im Übrigen ist es die native Erinnerung.
Android-Entwickler
6

Verwenden Sie den zweiten Prozess. AndroidManifestNeu anmelden Servicemit

android:process=":second"

Austausch zwischen erstem und zweitem Prozess vorbei BroadcastReceiver

Yura Shinkarev
quelle
5

Dies kann je nach Android-Betriebssystem auf zwei Arten erfolgen.

  1. Sie können das android:largeHeap="true"Anwendungs-Tag des Android-Manifests verwenden, um eine größere Heap-Größe anzufordern. Dies funktioniert jedoch nicht auf Geräten vor Honeycomb.
  2. Auf Geräten vor Version 2.3 können Sie die VMRuntime-Klasse verwenden . Dies funktioniert jedoch nicht mit Lebkuchen und höher. Weitere Informationen finden Sie weiter unten.
VMRuntime.getRuntime().setMinimumHeapSize(BIGGER_SIZE);

Stellen Sie vor dem Festlegen von HeapSize sicher, dass Sie die entsprechende Größe eingegeben haben, die sich nicht auf andere Anwendungs- oder Betriebssystemfunktionen auswirkt. Überprüfen Sie vor den Einstellungen nur, wie viel Größe Ihre App benötigt, und stellen Sie dann die Größe ein, um Ihren Auftrag zu erfüllen. Verwenden Sie nicht so viel Speicher, da dies andere Apps beeinträchtigen könnte.

Referenz: http://dwij.co.in/increase-heap-size-of-android-application

Webentwickler in Pune
quelle
4
Anscheinend hat <2.3 einen Weg und> 2.3 einen Weg, aber 2.3 ist geschraubt!
Michael
3

Soweit ich mich erinnere, konnten Sie VMRuntimeKlasse in frühen Android-Versionen verwenden, aber jetzt können Sie es einfach nicht mehr.

Ich denke nicht, dass es als so sicher angesehen werden kann, den Entwickler die Heap-Größe in einer mobilen Umgebung auswählen zu lassen. Ich denke, es ist einfacher, die Heap-Größe in einem bestimmten Gerät (nicht auf der Programmierseite) zu ändern, indem Sie versuchen, sie über die Anwendung selbst zu ändern.

Jack
quelle
0

Das Erhöhen von Java Heap führt zu unfairen Defiziten. Manchmal reicht es aus, nur auf den Garbage Collector zu warten und dann den Betrieb fortzusetzen, nachdem der Heap-Speicherplatz reduziert wurde. Verwenden Sie dann diese statische Methode .

Zon
quelle