Out-of-Memory-Fehler in android aufgrund der Heap-Größe Erhöhen
Ich bin immer out of Memory " - Fehlermeldung. Ich arbeite an einem live-chat-Anwendung. Es ist in Ordnung, aber wenn ich auf die Anwendung von 1-2 Stunden auf dem Gerät die heap-Größe erhöhen und wenn es erreicht bei 16 MB start der Anwendung hängen und stürzte nach einiger Zeit und zeigt out of memory due to heap size
da die resultierende heap-Größe ist größer als der zugewiesene.
Teste ich meine Anwendung auf dem HTC Explorer. In meiner Anwendung werden die meisten Aktivitäten sind mit hintergrund-thread, und dafür bin ich mit Asnyc Aufgabe.
, Erhalte ich die Fehlermeldung wie die folgende.
04-30 16:53:14.658: E/AndroidRuntime(5707): FATAL EXCEPTION: MagentoBackground
04-30 16:53:14.658: E/AndroidRuntime(5707): java.lang.OutOfMemoryError: (Heap Size=20167KB, Allocated=16063KB, Bitmap Size=355KB)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.util.ByteArrayBuffer.<init>(ByteArrayBuffer.java:53)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.io.AbstractSessionInputBuffer.init(AbstractSessionInputBuffer.java:82)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.io.SocketInputBuffer.<init>(SocketInputBuffer.java:98)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.java:83)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.java:170)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.java:106)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.java:129)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:173)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
04-30 16:53:14.658: E/AndroidRuntime(5707): at com.live2support.CustomHttpClient.executeHttpPost1(CustomHttpClient.java:163)
Gibt es begrenzen heap-Größe? wie kann ich die lösen mein Problem?
...oder zu großen Arrays ?
ich bin nicht mit bitmap in meiner Anwendung.ich Habe einige Bilder in den drawable-Ordner und ich bin mit Ihnen nur, die sind nicht viel 15-20 Bilder, die ich habe.
brauchen Sie wirklich alle die Geschichte von chat zur Laufzeit, oder Sie pflegen diese chat-Geschichte in array oder collection-Objekt oder der Listen-Ansicht ist zu groß. Sie können dynamisch wachsende Liste anzeigen .
bei com.live2support.CustomHttpClient.executeHttpPost1(CustomHttpClient.java:163) - Sie sind etwas zu tun, dass occupy eine gute Menge an Speicher jedes mal..versuchen zu befreien, dass der Speicher so schnell du das..auch überall die Objekte der arraylist,bitmaps löschen aus dem Speicher, sobald Sie es verwenden..einmal verwenden, weisen Sie null-und Ruf-System.gc(); angeben, ein flag zum garbage collector.
InformationsquelleAutor nikki | 2012-03-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Frage hat zwei Teile:
1) Wie kann ich bestimmen, die Größe der Haufen auf meinem test-Gerät?
2.) Warum ist meine app, die mehr als die Größe von meinem Haufen?
Zu Frage 1 bestimmen Sie die Größe der Haufen auf Ihrem test-Gerät direkt in Ihrem code aufrufen:
Laufzeit.getRuntime().maxMemory();
Sehen dieser Beitrag für weitere Informationen über diese Methode, sowie einige Beispiel-Speichergrößen auf den unterschiedlichen Geräten verfügbar.
Auch, wenn Sie eine verwurzelt Gerät, kann es eine Möglichkeit, direkt zu setzen (und überprüfen) Sie die heap-Größe über die Schnittstelle. Zum Beispiel in CyanogenMod die verschiedenen Android-Versionen, aus dem Menü Einstellungen, wählen Sie "CyanogenMod Einstellungen" und dann auf "Leistung" und dann auf "VM-heap size" und direkt einsehen (und ändern) die heap-Größe für Ihr Gerät. Seien Sie vorsichtig, wie die Einstellung der heap-Größe zu klein ist, kann Ihr Gerät sich schlecht benehmen oder schlechter.
Zu Frage 2: haben Sie nicht genug Informationen, um zu diagnostizieren, wie Sie Ihr spezifisches problem, und in jedem Fall, so eine Diagnose aus zweiter hand, ist bestenfalls schwierig. Ihre beste Wette für die Lösung dieses Problem (und für das lernen etwas von bleibendem Wert in den Prozess) wäre, vertraut zu werden mit einigen der sehr leistungsfähige Speicher-Analyse-tools in Android zur Verfügung (von denen einige auch integriert in die Eclipse-IDE). Ich benutze diese tools von Eclipse, so dass ist, was ich weiter unten beschreiben.
Zunächst stellen Sie sicher, dass Ihre Eclipse-version ist up-to-date durch die Installation der neuesten version von Eclipse (z.B. Indigo).
Nächsten, in Eclipse, wählen Sie Help/Install New Software", und klicken Sie dann auf das dropdown-Menü in der oberen und wählen Sie
Nächste, öffnen Sie die Allzweck-Tools-Kategorie durch Klick auf das plus-Zeichen neben es und wählen Sie " Speicher-Analysator und auch die Arbeitsspeicher-Analyzer (Charts) [optional]. Diese tools installieren.
Als Nächstes wählen Sie Window/Preferences, und klicken Sie dann Android/DDMS, und wählen Sie den HPROF-action, wie "Öffnen Sie in Eclipse". Dies führt dazu, HPROF-heap-dump-Datei, die Sie generieren, von DDMS zu sein, das geeignete format für Eclipse, und wird auch dazu führen, dass automatisch geöffnet werden, in Eclipse Memory Analyzer (was gerade installiert wurde oben).
Öffnen Sie nun DDMS durch Auswahl von " Fenster/Perspektive Öffnen/Andere/DDMS. Wählen Sie das Geräte-Symbol (sieht aus wie ein Telefon) auf der linken Seite und ziehen Sie die resultierende Fenster, so dass es angedockt ist irgendwo Sie können sehen, es leicht.
Stellen Sie sicher, dass Ihr Gerät an den PC angeschlossen, per USB, und, dass Ihre app ausgeführt wird.
In der Geräte-Registerkarte, die Sie gerade erstellt haben, wählen Sie Ihre Lauf-app auf dem Prozess. Führen Sie die app zu dem Punkt, wo es eingenommen hat genug Speicher, dass Sie wissen, es ist ausgelaufen, aber nicht so viel, dass es kracht. Jetzt, klicken Sie auf das Dump HPROF-Datei-Symbol in der Registerkarte "Geräte". Nach einer kurzen Verzögerung erhalten Sie eine Auswahl von berichten, die auf Ihrem Haufen. Versuchen, das Leck Vermutet, Bericht zum Einstieg. Dieser Bericht wird in der Speicher-Analyse-Tool. Es sagt Ihnen, wo sich Ihre app Speicher nutzen. Überprüfen Sie die verschiedenen Arten von Objekten und sehen, wenn Sie sehen, die aufgebläht im Verhältnis zu der Menge der Daten, die Sie erwarten würden, Sie zu verlangen; wenn dem so ist, kann darauf hindeuten, ein Leck.
Hier ist ein nettes tutorial beschreibt im detail, wie Sie zu erzeugen und zu erkunden, Ihr heap, DDMS und Memory Analyzer.
Zurück in DDMS (oder die DDMS-Perspektive in Eclipse), Sie können wählen Sie den Allocation Tracker", während Ihr Gerät angeschlossen ist, und dann Ihr Gerät aus der Registerkarte "Geräte", und wählen Sie dann app-Prozess aus der Liste für das Gerät. Dann, bei der Zuweisung Tracker Registerkarte, klicken Sie auf Start Tracking-Taste, und führen Sie Ihre app relevanten Vorgänge (diejenigen, die Sie vermuten, sind undicht), und klicken Sie dann auf den Zuweisungen Taste, und wählen Sie dann die Stop-Tracking-Taste.
Zeigt alle Zuordnungen, die aufgetreten sind, während Sie wurden tracking (es sind Grenzen für den Betrag, den Sie speichern). Ein Klick auf eines dieser Sie ergreifen wird, um den Stapel im Zeitpunkt der Zuteilung, und klicken Sie auf eine Stelle, die stack dump wird Sie in den source-code, der eingebunden war in die Zuteilung.
Diese tools sollen Ihnen einen kleinen Einblick in das, was verursachen könnte, dass Ihre app ein Speicherleck.
InformationsquelleAutor Carl
Sieht es wie ein klassisches memory-leak. Sie sagen, dass Sie verwenden
AsyncTask
für die Verbindung. Es ist sehr einfach Auslaufen Zusammenhang mit einem AsyncTask auf änderungen an der Konfiguration (z.B. Drehung des Geräts), wenn Sie nicht wissen, wie um es richtig zu nutzen.Erste, was ich dringend empfehlen, Sie zu beobachten: http://www.youtube.com/watch?v=_CruQY55HOk
Um zu überprüfen, ob Sie solch ein Speicher-Leck, drehen Sie Ihr Gerät und überprüfen, wie der Garbage-Collector verhält. Solltest du so etwas wie
GC_... freed 211K, 71% free 300K/1024K, external 0K/0K, paused 1ms+1ms
in deinem LogCat fast jedes mal, wenn Sie drehen. Uhr für Veränderungen in diesem Teil:300K/1024K
. Wenn Sie nicht über Speicher-Lecks, sollte der erste Teil wachsen und dann kleiner werden, nach ein paar GCs. Wenn Sie einen Speicherverlust haben, wird es wachsen und wachsen, bis zu dem Punkt der OOM Fehler.Wenn Sie machen sicher, dass Sie einen Speicherverlust auf diese Weise, was Sie tun sollten, ist zu installieren-MATTE für Eclipse, lernen, wie es (mit den oben erwähnten Film) und finden Sie heraus, was es verursacht.
Meine persönliche Wette wäre eine schlechte Umsetzung der AsyncTask - tun Sie lösen es aus zerstörten Aktivität und befestigen Sie es an die neue? Wenn nicht, starten Sie es (es ist ein ausgezeichnetes Beispiel von CommonsWare), oder wechseln Sie zu
AsyncTaskLoader
was es für Sie tut und ist generell ein guter Ersatz fürAsyncTask
(nicht nur für die be-Zeug).InformationsquelleAutor Michał K
Fügen Sie einfach
android:largeHeap="true"
im application-tag in Ihr manifestiert.InformationsquelleAutor Sayooj
Ihre heap-Größe die Grenze ist geräteabhängig. Auf einem 2.x Gerät, erwarte ich etwa 20 oder 32 MB ist das limit. Sehen Android-heap-Größe auf verschiedenen Telefonen/- Geräten und OS-Versionen weitere Informationen zu Speichergrößen.
Von Ihrem stack-trace, es sieht aus wie
com.live2support.CustomHttpClient.executeHttpPost1()
im Zentrum des Problems.Üblichen Sachen. Ich würde versuchen, die Dinge in dieser Reihenfolge: 1. die visuelle Inspektion der code. Auch vielleicht fügen Sie Ihre Funktion auf diese Frage an, SO können andere check it out. 2. Schritt durch den code über ein source-level-debugger. 3. Verwenden DDMS wenn 2 nicht den trick tun. developer.android.com/guide/developing/debugging/ddms.html
InformationsquelleAutor Sparky
Dies kann durch zwei Wege nach Ihren Android-OS.
android:largeHeap="true"
im application-tag von Android-manifest auf Anfrage eine größere heap-Größe, aber dies funktioniert nicht in jedem pre-Honeycomb-Geräte.Bevor HeapSize-Einstellung stellen Sie sicher, dass Sie eingegeben haben, die entsprechende Größe, die sich nicht auf andere Anwendungs-oder Betriebssystem-Funktionalität. Bevor Sie die Einstellungen nur überprüfen, wie viel die Größe der app dauert & legen Sie dann die Größe, die nur zu erfüllen Ihren job. Verwenden Sie nicht so viel Speicher sonst andere apps beeinflussen könnte.
Referenz: http://dwij.co.in/increase-heap-size-of-android-application
InformationsquelleAutor Web Developer in Pune