Was sind die Vorteile, wenn Sie largeHeap auf true setzen?

122

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.

Intsab Haider
quelle
Wenn Sie großen Speicher für Ihre App wie Spiele 3D-Modelle usw.
benötigen
47
50 Klassen sind nicht so viele.
Chris Hayes
Wenn Sie einen Dienst oder eine andere Anwendungs-App in Ihrer App verwenden, die Speicher verbraucht, tritt bei Ihrer App ein Speicherproblem auf, z. B. ist die Kamera das häufigste Problem für Entwickler bei der Verwendung der App, oder wenn Sie viele Variablen haben, die Speicher oder statisch verbrauchen Variable kann auch der Grund dafür sein.
Aditi
4
Die Anzahl der Klassen ist nicht wichtig. Was normalerweise viel Speicher benötigt, sind Bitmaps. Siehe " Laden einer verkleinerten Version in den Speicher ".
ToolmakerSteve

Antworten:

116

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:

Die Möglichkeit, einen großen Heap anzufordern, ist jedoch nur für eine kleine Anzahl von Apps vorgesehen, die die Notwendigkeit rechtfertigen, mehr RAM zu verbrauchen (z. B. eine große Fotobearbeitungs-App). Fordern Sie niemals einen großen Heap an, nur weil Ihnen der Speicher ausgeht und Sie eine schnelle Lösung benötigen. Sie sollten ihn nur verwenden, wenn Sie genau wissen, wo Ihr gesamter Speicher zugewiesen wird und warum er beibehalten werden muss. Selbst wenn Sie sicher sind, dass Ihre App den großen Haufen rechtfertigen kann, sollten Sie es vermeiden, ihn so weit wie möglich anzufordern. Die Verwendung des zusätzlichen Speichers wird sich zunehmend nachteilig auf die allgemeine Benutzererfahrung auswirken, da die Speicherbereinigung länger dauert und die Systemleistung langsamer sein kann, wenn Aufgaben gewechselt oder andere allgemeine Vorgänge ausgeführt werden.

Hier ist der vollständige Link der Dokumentation https://developer.android.com/training/articles/memory.html

AKTUALISIEREN

Nachdem ich exkrutierend mit gearbeitet habe, out of memory errorswü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 App

UPDATE 2

Hier sind ein paar Tipps zu beschäftigen mitout 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

Mightian
quelle
1
Warum sagst du "es hat keinen Einfluss auf die normale Funktionsweise der App"? Diese Antwort beschreibt einige Konsequenzen. An anderer Stelle habe ich bei einigen Apps ein noch schlechteres Timing für LargeHeap GC gesehen.
ToolmakerSteve
59

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 :

  • Offensichtlich erhalten Sie einen größeren Haufen, was bedeutet, dass das Risiko von verringert wird 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 largeHeapOptionen so oft wie möglich. Dies kann Sie schwer zu bemerkende Leistungseinbußen und eine schlechte Benutzererfahrung kosten.

김준호
quelle
17

Ich habe eine App mit fast 50 Klassen

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.

Milad Faridnia
quelle
1
Zum Laden von Bildern empfehle ich generell Picaso oder Universal Image Loader
Mightian
5
Gleiten ist besser und etwas optimierter als Picasso
Damien Praca
1
@DamienPraca Ich glaube nicht, zumindest wenn Sie Tags (setTag (), pauseTag (), resumeTag ()) in Picasso richtig verwenden.
Ruslan Berozov
15

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.

Sergey Shustikov
quelle
4
Ja, es gibt eine klare Definition. Verweisen Sie auf diesen Link. developer.android.com/training/articles/memory.html
Mightian
2
@war_Hero - Vielleicht hat dieser Artikel seinen Inhalt geändert? Es gibt keine Erwähnung von largeHeap.
ToolmakerSteve
7

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()und onResume()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(), und getLargeMemoryClass().

Stellt für die meisten Geräte maxMemory()einen ähnlichen Wert dar wie getMemoryClass()standardmäßig, obwohl letzterer in Megabyte ausgedrückt wird, während ersterer in Byte ausgedrückt wird.

Wenn Sie den largeHeapParameter 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, und largeHeapnicht 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 Verwendung largeHeapist 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 largeHeapParameters durch Aufrufen der Methode genau ermitteln, wie viel Speicher auf einem bestimmten Gerät verfügbar sein würde getLargeMemoryClass(). Der zurückgegebene Wert wird in Megabyte angegeben.

Dieser frühere Beitrag enthält eine Diskussion des largeHeapParameters 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 largeHeapParameter 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.

Carl
quelle
1
"verlassen alle Vorsicht und oink seinen Weg durch das Buffet all-you-can-eat" 😂
Joshua Pinter
4

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.

Murali Ganesan
quelle