2012-03-28 6 views
0

Um zu beginnen, danke für die Zeit nehmen, um über meine Frage zu sehen. Ich habe momentan Probleme mit dem Speicher-Spiking in der Anwendung, die ich entwickle.Android Speicher Spiking

Meine Absicht ist, in der Lage zu sein, große Mengen von HTML-Daten zu downloaden und zu verarbeiten, derzeit ist die Ursache von großen Base64-kodierten Bildern im HTML verschachtelt, die ich nicht für die Verwendung auf einer mobilen Plattform ideal verstehe. Für den Rekord, teste ich gerade auf einem Samsung Galaxy S. Auch dieses Problem tritt nicht auf dem Galaxy Nexus wegen mehr Speicherzuweisung pro Anwendung auftreten.

Mein Problem ist, dass während der Verarbeitung eines großen Chunks von HTML-Daten von ca. 2,8 MB, der Speicher-Heap auf 27-29 MB erhöht, aber der zugewiesene Speicher nie überschreitet 18-19 MB. Wenn der HTML-Code verarbeitet, gespeichert und angezeigt wurde, kehrt der zugewiesene Speicher zu ca. 3-4 MB zurück. Wenn ich dann diesen HTML-Code erneut herunterladen und verarbeiten soll, wiederholt sich der Vorgang und ich bekomme den gleichen Speicherverbrauch, nur dass es scheint, den Heap weiter zu erhöhen (was mir nicht notwendig erscheint), an dieser Stelle bekomme ich einen Out of memory Fehler.

Wenn ich diesen Fehler erhalte, ist es normalerweise während des Herunterladens des HTML mit HttpGet oder beim Extrahieren der Daten von der Festplatte mit einem StringBuffer. Gelegentlich wird es durch eine Bitmap während einer XML-Inflation verursacht.

Jede Hilfe würde sehr geschätzt werden.

+0

Galaxy S hat 2,3 läuft, oder? Sie vergleichen also Lebkuchen mit ICS. Sie sollten versuchen, nach dem Parsen so gut wie möglich aufzuräumen ... – WarrenFaith

+0

Danke für die Antwort. Das Galaxy S ist 2.3.6. Ich bereite soviel auf, wie ich kann, ich bin nur neugierig, warum der zugewiesene Speicher nie 18 MB überschreitet, aber trotzdem versucht, den Heap zu erweitern ... –

+0

Bitte posten Sie die LogCat-Ausgabe, die für die Garbage Collections und das fehlerhafte Final erzeugt wurde Zuweisung. –

Antwort

0

Es gibt wenig, was Sie tun können, wenn Sie wirklich diese Menge an Speicher benötigen. Telefone haben begrenzten Speicher.

Der Speicher zum Speichern von Daten ist nicht sofort verfügbar. Es kann mehrere Iterationen dauern, um den gesamten Speicher freizugeben (und jede Iteration könnte einige Sekunden auseinander liegen).

Häufig treten Probleme mit zu viel Arbeitsspeicher auf, die von Bildern/Zeichen verwendet werden. Manchmal ist es ein Speicherleck; andere Male ist es nicht möglich zu sagen, was es verursacht.

Ich hatte auch Probleme beim Parsen von großen XML-Dateien. Meine Lösung bestand darin, diese Dateien in kleinere aufzuteilen. Eine weitere Möglichkeit ist die Berücksichtigung der Vor- und Nachteile verschiedener XML-Parser (erstes Google-Ergebnis: SAX parser vs XML pull parser). Vielleicht eine Drittanbieter-Implementierung verwenden, die speziell mit Bedenken hinsichtlich der Speichernutzung entwickelt wurde? Eine dritte Option ist die Verwendung eines Servers, um die XML-Datei in ein effizienteres Format zu konvertieren.

+0

Danke für die Antwort Pedro, ich werde später nach Bibliotheken von Drittanbietern suchen. Ich analysiere gerade HTML von JSON-Daten, aber ich kann nicht scheinen, das Gedächtnis für größere Datenbrocken durchzuspüren. –

0

Die beste Vorgehensweise besteht nicht darin, viel Speicher zuzuweisen. Verarbeiten Sie die Daten im Stream, während Sie sie aus dem Netzwerk lesen, oder streamen Sie sie auf die Festplatte, und lesen Sie von dort aus. Die Option android: largeHeap ist auf allen Geräten verfügbar, auf denen Android 3.0 oder höher ausgeführt wird. Wenn Sie jedoch nur den Betrag erhöhen, den Sie zuweisen können, müssen Sie das Limit nicht vollständig entfernen.