Ich habe eine App mit fast 50 Klassen, die ich einstelle android:largeHeap="true"
, wie unten zu sehen ist. Ist das eine gute Praxis?
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="Mall"
android:largeHeap="true"
android:logo="@drawable/logo_for_up"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" >
</application>
Bitte schlagen Sie Vor- und Nachteile für die Verwendung vor.
Ich bekomme Gedächtnisprobleme, deshalb stelle ich diese Frage.
android
android-largeheap
Intsab Haider
quelle
quelle
Antworten:
Viel zu spät für die Party hier, aber ich werde trotzdem meine 0.02 $ anbieten.
Es ist keine gute Idee,
android:largeHeap="true"
hier den Auszug aus Google zu verwenden, der dies erklärt:Hier ist der vollständige Link der Dokumentation https://developer.android.com/training/articles/memory.html
Nachdem ich exkrutierend mit gearbeitet habe,
out of memory errors
würde ich sagen, dass das Hinzufügen zum Manifest, um das Problem zu vermeiden, keine Sünde ist, auch wie @Milad unten ausführt, hat dies keinen Einfluss auf die normale Arbeitsweise der AppHier sind ein paar Tipps zu beschäftigen mit
out of memory errors
1) Verwenden Sie diesen Rückruf, den Android gibt
onLowMemory
,onTrimMemory(int)
und leeren Sie den Cache von Bildern wie (Picasso, Glide, Fresco ....). Sie können hier und hier mehr darüber lesen.2) Komprimieren Sie Ihre Dateien (Bilder, PDF).
3) Lesen Sie darüber So gehen Sie hier effizienter mit Bitmap um
4) Verwenden Sie regelmäßig Flusen, bevor die Produktion vorantreibt, um sicherzustellen, dass der Code glatt und nicht sperrig ist
quelle
Ich halte dies für eine sehr effektive Frage und möchte einige Details zu den Vor- und Nachteilen der Verwendung dieser Option hinzufügen.
Was man bekommt :
OutOfMemoryError
.Was Sie verlieren:
Möglicherweise verlieren Sie einige Frames, was zu sichtbaren Problemen führen kann . Bei einem größeren Haufen dauert die Speicherbereinigung länger. Weil der Garbage Collector grundsätzlich Ihre gesamte Live-Gruppe von Objekten durchlaufen muss. Normalerweise beträgt die Pausenzeit für die Speicherbereinigung etwa 5 ms, und Sie denken möglicherweise, dass einige Millisekunden keine große Sache sind. Aber jede Millisekunde zählt. Das Android-Gerät muss seinen Bildschirm alle 16 ms aktualisieren. Eine längere GC-Zeit kann dazu führen, dass die Frame-Verarbeitungszeit die 16-Millisekunden-Grenze überschreitet, was zu sichtbaren Problemen führen kann.
Auch das Wechseln von Apps wird langsamer . Das Android-System beendet möglicherweise Prozesse im LRU-Cache, beginnend mit dem zuletzt verwendeten Prozess, berücksichtigt jedoch auch, welche Prozesse am speicherintensivsten sind. Wenn Sie also einen größeren Heap verwenden, wird Ihr Prozess mit größerer Wahrscheinlichkeit im Hintergrund abgebrochen. Dies bedeutet, dass es möglicherweise länger dauert, wenn Benutzer von anderen Apps zu Ihren wechseln möchten. Auch andere Prozesse im Hintergrund werden eher rausgeschmissen, wenn Ihr Prozess im Vordergrund steht, da Ihre App mehr Speicher benötigt. Das Wechseln von Ihrer App zu anderen Apps dauert ebenfalls länger.
Fazit :
Vermeiden Sie die Verwendung von
largeHeap
Optionen so oft wie möglich. Dies kann Sie schwer zu bemerkende Leistungseinbußen und eine schlechte Benutzererfahrung kosten.quelle
Ich denke nicht, dass dies ein großes Problem darstellt. Der Grund, warum Sie einen outOfMemory-Fehler haben, ist normalerweise das Laden zu vieler Bilder in Ihre App oder ähnliches. Wenn Sie mit der Verwendung eines großen Heaps nicht zufrieden sind, müssen Sie einen Weg finden, um die Verwendung des Speichers zu optimieren.
Sie können auch Bildladebibliotheken wie Picasso , UIL oder Glide verwenden . Alle von ihnen haben die Funktion des Image-Caching im Speicher und / oder auf der Festplatte.
quelle
Eigentlich android: largeHeap ist das Instrument, um den der App zugewiesenen Speicherplatz zu erhöhen.
Es gibt keine klare Definition für die Notwendigkeit, dieses Flag zu verwenden. Wenn Sie mehr Speicher benötigen - Android bietet Ihnen ein Tool, um ihn zu erhöhen. Aber die Notwendigkeit der Verwendung definieren Sie sich.
quelle
Wenn Sie eine große Menge an Speicher verwenden (und behalten) müssen , können und sollten Sie diese verwenden
android:largeHeap="true"
. Wenn Sie es jedoch verwenden, sollten Sie darauf vorbereitet sein, dass Ihre App aus dem Speicher gelöscht wird, wenn andere Apps im Vordergrund stehen.Mit "vorbereitet sein" meine ich, dass Sie für diese Wahrscheinlichkeit entwerfen sollten, damit Ihre
onStop()
undonResume()
Methoden so effizient wie möglich geschrieben werden, während sichergestellt wird, dass alle relevanten Zustände auf eine Weise gespeichert und wiederhergestellt werden, die dem Benutzer ein nahtloses Erscheinungsbild bietet.Es gibt drei Methoden, die diese Parameter betreffen:
maxMemory()
,getMemoryClass()
, undgetLargeMemoryClass()
.Stellt für die meisten Geräte
maxMemory()
einen ähnlichen Wert dar wiegetMemoryClass()
standardmäßig, obwohl letzterer in Megabyte ausgedrückt wird, während ersterer in Byte ausgedrückt wird.Wenn Sie den
largeHeap
Parameter verwenden,maxMemory()
wird er auf eine gerätespezifische höhere Ebene erhöht,getMemoryClass()
bleibt jedoch unverändert.getMemoryClass()
schränkt Ihre Heap-Größe nicht ein, gibt jedoch an, wie viel Heap Sie verwenden sollten , wenn Ihre App innerhalb der Grenzen des jeweiligen Geräts, auf dem Sie ausgeführt werden, komfortabel und kompatibel funktionieren soll .maxMemory()
Im Gegensatz dazu ist Ihre Heap - Größe, einschränken und so Sie seinen Wert durch zunehmende Verstärkung Zugriff auf zusätzliche Haufen zu tun, undlargeHeap
nicht erhöht diesen Wert. Die erhöhte Menge an Heap ist jedoch immer noch begrenzt, und diese Begrenzung ist gerätespezifisch. Dies bedeutet, dass die Menge an Heap, die Ihrer App zur Verfügung steht, abhängig von den Ressourcen des Geräts variiert, auf dem Ihre App ausgeführt wird. Die VerwendunglargeHeap
ist also keine Einladung für Ihre App, alle Vorsicht aufzugeben und sich durch das All-you-can-eat-Buffet zu schleichen.Ihre App kann mithilfe des
largeHeap
Parameters durch Aufrufen der Methode genau ermitteln, wie viel Speicher auf einem bestimmten Gerät verfügbar sein würdegetLargeMemoryClass()
. Der zurückgegebene Wert wird in Megabyte angegeben.Dieser frühere Beitrag enthält eine Diskussion des
largeHeap
Parameters sowie eine Reihe von Beispielen dafür, welche Heap-Mengen mit und ohne Verwendung auf mehreren spezifischen Android-Geräten verfügbar gemacht werden:Ermitteln Sie die Größe des Anwendungsheaps in Android
Ich habe keine meiner eigenen Apps mit diesem Parameter auf true bereitgestellt. Ich habe jedoch in einer meiner Apps speicherintensiven Code zum Kompilieren einer Reihe von optimierungsbezogenen Parametern, der nur während der Entwicklung ausgeführt wird. Ich füge den
largeHeap
Parameter nur während der Entwicklung hinzu, um Speicherfehler zu vermeiden, während dieser Code ausgeführt wird. Ich entferne jedoch den Parameter (und den Code), bevor ich die App bereitstelle.quelle
Gibt an, ob die Prozesse Ihrer Anwendung mit einem großen Dalvik-Heap erstellt werden sollen. Dies gilt für alle für die Anwendung erstellten Prozesse. Dies gilt nur für die erste in einen Prozess geladene Anwendung. Wenn Sie eine gemeinsam genutzte Benutzer-ID verwenden, um mehreren Anwendungen die Verwendung eines Prozesses zu ermöglichen, müssen alle diese Option konsistent verwenden, da sonst unvorhersehbare Ergebnisse erzielt werden.
Die meisten Apps sollten dies nicht benötigen und sich stattdessen darauf konzentrieren, die Gesamtspeicherauslastung zu reduzieren, um die Leistung zu verbessern. Das Aktivieren dieser Option garantiert auch keine feste Erhöhung des verfügbaren Speichers, da einige Geräte durch ihren insgesamt verfügbaren Speicher eingeschränkt sind.
quelle