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?
largeHeap=true
FTWAnwendungen, 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, undgetLargeMemoryClass()
onActivityManager
zeigt an, wie groß dieser Heap ist. Jedoch:Dies funktioniert nur auf API Level 11+ (dh Honeycomb und höher).
Es gibt keine Garantie dafür, wie groß der große Haufen sein wird
Der Benutzer nimmt Ihre Anforderung eines großen Heaps wahr, da dadurch
die anderen Apps aus dem RAM gezwungenwerden, die Prozesse anderer Apps zu beenden, um den System-RAM für die Verwendung durch Ihren großen Heap freizugebenAufgrund von Nummer 3 und der Tatsache, dass ich davon ausgehe, dass
android:largeHeap
dies 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 )Derzeit ist diese Funktion nur geringfügig dokumentiert
quelle
inBitmap
weiterBitmapOptions
). Entfernen Sie darüber hinaus alle Verweise auf sie, und schließlich werden sie mit Müll gesammelt.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.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:
So speichern Sie Bitmaps im nativen Speicher
JNI-Bitmap-Operationen zur Vermeidung von OOM bei Verwendung großer Bilder
und hier ist eine Bibliothek, die ich dafür gemacht habe:
quelle
Verwenden Sie den zweiten Prozess.
AndroidManifest
Neu anmeldenService
mitAustausch zwischen erstem und zweitem Prozess vorbei
BroadcastReceiver
quelle
Dies kann je nach Android-Betriebssystem auf zwei Arten erfolgen.
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.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
quelle
Soweit ich mich erinnere, konnten Sie
VMRuntime
Klasse 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.
quelle
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 .
quelle