Zu viel Ramverbrauch (analysiert mit MAT). Wie entgegenwirken?

  • Antworten:18
Martin H.
  • Forum-Beiträge: 16

23.02.2012, 17:38:53 via Website

Hallo,
ich habe meine App fast fertig programmiert und wollte nun die Schnelligkeit ein wenig verbessern (manchmal laggt es, da der Garbage Collector arbeiten muss). Nun habe ich mithilfe eines Speicher-Dumps und dem Tool MAT herausgefunden, dass direkt beim Start der App (wo noch keine Bilder geladen worden sind) schon ca. 14 MB Ram benötigt wird.
Zum Testen habe ich ein neues Android-Projekt in Eclipse angelegt (also HelloWorld-Activity) und selbst diese braucht direkt zum Start 14MB. Bei der genaueren Untersuchung des Speicher-Dumps habe ich nun entdeckt, dass beim Start einer App gut 14 MB aus den android.content.res.Ressources geladen werden (dies sind also keine eigenen Ressourcen, sondern Ressourcen von Android selbst).

Woran kann dies liegen, habe ich Eclipse mit dem AndroidPlugin falsch installiert (Auf Notebook und Computer)? Macht das Handy das Problem (Bei Galaxy Nexus [4.02] und HTC Desire [2.3.5])?
Ich kann auch gerne den Speicher-Dump hochladen, wenn das weiterhelfen würde (15 MB hochzuladen dauert hier ein wenig, von daher lade ich es hoch, wenn jemand meint, dass es was nützt).

Schon einmal Danke für die Hilfe

Antworten
Markus B.
  • Forum-Beiträge: 636

23.02.2012, 18:48:16 via Website

Hallo,
also ich habe mir gerade mal eine HelloWorld App im DDMS angeschaut und dort werden 2.510 MB beim Starten reserviert.
Wäre schon interessant zu wissen warum es bei dir dann 14 MB sind. Somit würde ich dein Angebot zum Hochladen des Dumps gerne annehmen.

Gruß,
Markus

Antworten
Martin H.
  • Forum-Beiträge: 16

23.02.2012, 19:38:39 via Website

Im DownloadLink ist der Dump von der TestActivity (dort sins 12,3 anstatt 14 Mb, aber dennoch zu viel^^). Ich hoffe ihr/du kannst das File öffnen, denn normalerweise lass ich mir den Dump direkt in Eclipse anzeigen und nun habe ich ihn als Datei speichern lassen, kann ihn in Eclipse aber irgendwie nicht öffnen (möglicherweise muss man das noch umwandeln, habe davon mal gelesen, habe es aber nie getestet). Ich hoffe du kannst mit dem File was anfangen (oder wenn nicht, mir sagen, wie ich dir eine vernünftige Datei geben kann :))

https://rapidshare.com/files/2253774512/Test.hprof

Antworten
Markus B.
  • Forum-Beiträge: 636

23.02.2012, 22:23:03 via Website

Hi,
also ich habe mir die .hprof angeschaut und kann auch den Speicherverbrauch sehen 13,2 MB.
Ich kann aber auch sehen das alleine 11 MB bei android.content.res.Resources sPreloadedDrawables verbraucht werden. Kommt der .hprof denn von dem HelloWorld oder von deiner eigentlich App ?!
Ich interpretiere so, dass einfach drawables geladen werden womit du nicht gerechnet hast. Kann das evtl. sein ?
Wenn das alles nicht passen sollte kannst du mir dann mal die Sourcen zuschicken ? Es würde ich nämlich echt interessieren das Problem zu finden.

Gruß,
Markus

Antworten
Martin H.
  • Forum-Beiträge: 16

23.02.2012, 22:43:31 via Website

Also das ist der Dump von der HelloWorld Activity, an der ich absolut nichts geändert habe. Der Quellcode ist also:

1package schooltec.test;
2import android.app.Activity;
3import android.os.Bundle;
4
5public class TestActivity extends Activity {
6 /** Called when the activity is first created. */
7 @Override
8 public void onCreate(Bundle savedInstanceState) {
9 super.onCreate(savedInstanceState);
10 setContentView(R.layout.main);
11 }
12}

An der main.xml und am Manifest habe ich auch nichts geändert.

Das mit den preloadedDrawables habe ich auch gesehen, kann es mir aber absolut nicht erklären (in der HelloWorld Activity werden ja standardmaesig keine Drawables geladen). Danke für deine starken Bemühungen, vielleicht siehst du ja den Fehler :)

Edit: Ich habe die HelloWorld gerade mal auf dem Emulator laufen lassen, dort brauch es nur 3 anstatt den 12 MB. Auch meine richtige App braucht dort beim Start nur diese 3 MB. Komisch ist allerdings, dass die App nicht mehr Ram verbraucht, wenn ich die ganzen Bilder lade (in meiner App lade ich ca. 20 Bilder, die normalerweise so 5 MB Ram benötigen). Also entweder kann man mit dem DDMS und dem Emulator nicht richtig arbeiten oder mein Handy hat Ram.Probleme (auf anderen Handys ist aber dasgleiche Problem, habe es schon bei mehreren Leuten mit den verschiedensten Android-Geräten probiert)

— geändert am 23.02.2012, 22:51:09

Antworten
Markus B.
  • Forum-Beiträge: 636

23.02.2012, 22:57:40 via Website

Hi,
erklären kann ich es mir im Moment auch nicht. Ich weiß hört sich jetzt dumm an aber kannst du mir das ganze HelloWorld Projekt von dir hochladen ?
Wie gesagt bei meinem sind es einfach nur 2,51 MB und dort kann ich diese Eigenart nicht nachvollziehen. Desweiteren wäre es dann noch interessant zu wissen wie du die .hprof erstellt hast.

Gruß,
Markus

Antworten
Martin H.
  • Forum-Beiträge: 16

23.02.2012, 23:02:38 via Website

Hab das Projekt als zip hochgeladen, viel Spaß damit :)
Den Dump erstelle ich, indem ich zuerst die App im Debug-Mode starte, dann in den DDMS-Modus gehe, dort den Update-Heap-Button drücke, den Cause GC Button drücke und zuletzt den "Dump Hprof File"-Button.

https://rapidshare.com/files/237461958/HelloWorld.zip

PS: Bin erstmal Schlafen, morgen Mittag kann ich dann wieder antworten.

— geändert am 23.02.2012, 23:04:10

Antworten
Markus B.
  • Forum-Beiträge: 636

23.02.2012, 23:57:28 via Website

Hi,
also ich habe den Dump nun auch via DDMS erstellt und dieser besagt es werden maximal 2,1 MB benötigt.
Ich weiß nicht warum dann bei dir dort ein Dump mit 13,2 MB herausgekommen ist.

Gruß,
Markus

Antworten
Martin H.
  • Forum-Beiträge: 16

24.02.2012, 06:59:14 via Website

Also wird es entweder eine Einstellungssache in Eclipse sein oder mein Handy macht komische Sachen :) Ich werde nachher mal nen bisschen auf die Suche in Eclipse gehen, vielleicht findet sich ja was. Danke erstmal für deine Hilfe (oder hättest du ne Idee, woran es grob liegen könnte?)

— geändert am 24.02.2012, 06:59:27

Antworten
Markus B.
  • Forum-Beiträge: 636

24.02.2012, 10:36:53 via Website

Hi,
also ich behaupt jetzt einfach mal das eclipse nicht für den Anstieg von 628% Speicher verantwortlich ist. Das kannst du ja auch ganz einfach testen in dem du DDMS einfach auf der Konsole aufrufst. Woran das bei dir liegt kann ich die auch nicht genau sagen.
Ich beschreibe mal eben kurz hier meinen Ablauf zum erstellen des Dumps:
Ich teste auf dem Device auf welchem die entsprechende App hochgeladen wurde. Im optimal Fall liegt halt nur eine App im Debug-Mode auf dem Device. Die entsprechende App wir dann vom DDMS erkannt und die siehst dann halt dort nur ein Package gelistet.
Danach starte ich das Tracking und öffne die entsprechende App via shortcut auf meinem home-screen. Wenn die App geladen wurde stoppe ich das Tracking und lasse mir den Dump erzeugen. Das wars dann auch schon.
Es ging hierbei darum die Behauptung der 14 MB beim Starten zuprüfen.

Soweit zu meinem Vorgehen. Ich hoffe mal es hilft dir weiter.

Gruß,
Markus

Antworten
Martin H.
  • Forum-Beiträge: 16

24.02.2012, 11:18:06 via Website

Also ich mache das so, indem ich in Eclipse auf den Debug-Mode starten-Button drücke. Danach wird direkt auf dem Handy die App geöffnet, ich muss sie also nicht extra starten auf dem Handy. Vielleicht erstelle ich ja eine App, die immer irgendwie noch im "Entwicklermodus" ist, nur habe ich das nie explizit so eingestellt.

Antworten
Markus B.
  • Forum-Beiträge: 636

24.02.2012, 11:28:33 via App

Hi, eine App welche du nicht selbst signierst wird immer im Debug Modus gebaut. Wäre das nicht so könntest du nicht live gebuggen, da sich die bridge nicht mit dem device / elulator verbinden könnte. Somit musst du da nichts einstellen, es ist default einfach so :-)

Gruß,
Markus

Antworten
Martin H.
  • Forum-Beiträge: 16

24.02.2012, 11:55:27 via Website

Also ist es egal, ob die App direkt von Eclipse aus auf dem Gerät gestartet wird, oder ob ich die apk-Datei auf das Gerät ziehe und dort dann ausführe? Und wenn man es signiert, funktioniert der Debug-Mode sowieso nicht mehr, so habe ich dich zumindest verstanden :)

Antworten
Martin H.
  • Forum-Beiträge: 16

24.02.2012, 16:34:45 via Website

Hmm, ok,
das mit dem Debug-Flag hab ich nun glaub ich vestanden. Leider behebt das nicht mein Problem :) Es muss also irgendwie an meinen Einstellungen in Eclipse liegen, diese sind aber wie gesagt, komplett auf default, genauso wie die Entwickleroptionen beim Handy.

Antworten
Martin H.
  • Forum-Beiträge: 16

27.02.2012, 00:43:15 via Website

Also ich hab das ganze jetzt auch nochmal an meinem PC getestet, genau dasgleiche Spiel. Das Problem des Laggens muss auf jeden Fall am zu hohen Ram-Verbrauch liegen, denn auf dem Wildfire tut die App nicht laggen (bedingt dadurch, dass die Bitmap-Variablen in der App weniger Ram verbrauchen, sodass die 24MB Grenze nicht erreicht wird) und im Debug-Mode (wo man ja 48MB als max. Ram bekommt) die App auf dem Nexus auch nicht laggt.

Im Internet kann ich absolut keine Informationen zu diesen sPreloadedRessources finden. Normaler Ram-Verbrauch einer App beim Start sind wohl so 2-3 MB, nur irgendwie komme ich nicht auf diese Werte (leider). Hättest du (oder irgendwer anders) vielleicht noch irgendeinen Tipp für mich?

Antworten
Markus B.
  • Forum-Beiträge: 636

27.02.2012, 00:59:44 via App

Hi,
da müsste ich jetzt deine App selbst debuggen. Wenn du das möchtest tuhe ich das gerne. Dazu brauche ich dann halt deine kompletten sourcen via Mail, pm oder was auch immer :-)
Sonst wüsste ich auch nicht wie ich dir noch helfen kann.

Gruß,
Markus

Antworten
Martin H.
  • Forum-Beiträge: 16

28.02.2012, 02:20:30 via Website

ok, jetzt habe ich auch noch einen OutOfMemory-Fehler, da die neu hinzugefügte Bitmap jetzt wohl den Ram zum Überlaufen bringt^^ Ich werde dir die App schicken und vertraue dir da mal, dass du die nicht selbst veröffentlichst :) Immerhin bekommste nen super Spiel von mir, was halt nen bisschen laggt. Das Menue hat auch noch Bugs (bin da grad am Rumbasteln, ansonsten sollte es aber relativ stabil und gut laufen).
Danke für deine Bereitschaft den Fehler zu finden, ich hoffe ja, dass du da was rausbekommst, das wäre echt sehr cool.

Antworten
Markus B.
  • Forum-Beiträge: 636

28.02.2012, 07:22:01 via Website

Hi Martin,
erst mal Danke für dein Vertrauen. Du kannst mir hier vertrauen, da mich an deiner App nur an dem Fehler interessiert und du hast damit mein Interesse geweckt diesen zu finden :) Ich kann dir noch nicht versprechen das ich es heute schaffe aber spätestens morgen habe ich Zeit und setze mich dran,

Gruß,
Markus

Antworten