Speicherverbrauch zu hoch?

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

10.01.2012, 20:09:51 via Website

Hi,
ich habe folgendes Problem: In meiner App (Kartenspiel) erstelle ich Bitmaps, welche abhängig der Auflösung des Handys skaliert werden. Nun laggt es auf Handys mit hoher Auflösung, da die Grenze von 24 MB Ram durch die größeren Bitmaps überschritten wird und der GarbageCollector eingreifen muss.
Mittlerweile habe ich gemerkt, dass den Großteil der 24 MB aber nicht die skalierten Bitmaps belegen (diese betragen je nach Auflösung nämlich nur 2-8Mb). Schon zu Beginn der App (im Menü) werden bereits 15Mb Ram verbraucht. Nun die Frage: Wo kann der Ram-Verbrauch herkommen?
Im Menü habe ich keine Bitmaps (oder sonstige Bilder), deshalb kann es daran schonmal nicht liegen. Allerdings erstelle ich mehrere Instanzen von anderen Klassen. Ansonsten habe ich zum Zeitpunkt, wo die App im Menü ist, eigentlich nur boolean- und int-Werte erstellt.
Kann es vielleicht an irgendwelchen Einstellungen im Manifest liegen? Ich habe nun schon überall nach gesucht, aber warum 15Mb benötigt werden, verstehe ich einfach nicht.

Ich teste übrigens auf 2.33, 3.2 und 4.01, überall dasgleiche Problem. Danke für eure Hilfe

— geändert am 10.01.2012, 20:14:12

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

11.01.2012, 10:43:53 via Website

Ich lese dies zurZeit im Eclipse-Debug Mode ab. Dort steht unter dem Kürzel Dalvik-Cache (oder so ähnlich :)) der aktuelle Speicherverbrauch und wieviel Ram das Gerät gerade hat zugewiesen bekommen (im Debug-Mode darf das Gerät nämlich bis zu 48Mb verbrauchen)

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

11.01.2012, 10:49:26 via Website

OK, oft werden nämlich die Werte für maxMemory, freeMemory etc falsch interpretiert.
Die Größe der VM ist auch nicht gleich der Menge des aktuell belegten Speichers.
Auch wenn die VM 15MB belegt, kann der aktuell belegte Speicher bei wenigen MB liegen.
Die VM ist nur ein Container, der mit einer bestimmten Größe startet und bei Bedarf bis auf die Größe maxMemory ausgedehnt werden kann.

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

11.01.2012, 11:04:40 via Website

Ok, aber dennoch tun die Werte im Zusammenhang mit dem wirklichen Speicherverbrauch stehen. Denn wenn meine App im Debug-Mode maximal 20 Mb benötigt, läuft sie im normalen Modus auch flüssig. Wenn sie im Debug-Mode ca. 30 Mb benötigt, läuft sie dann auch im normalen Modus NICHT flüssig.

Ich müsste also wissen, wo denn potenziell viel Speicher allokiert wird.

— geändert am 11.01.2012, 11:05:16

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

11.01.2012, 11:11:02 via Website

Ein paar wenige MB belegt die VM und die App schon selbst. Jedoch sind das deutlich weniger als 15.
Es sei denn deine App ist grafisch sehr aufwändig.

Klasseninstanzen verbrauchen selbst sehr wenig Speicher.
Was die meisten Resourcen frisst sind String- und Binärdaten.
Wenn du lange Strings einliest und mit substring arbeitest, könnte auch das ein Thema für dich sein.
http://www.javamex.com/tutorials/memory/string_saving_memory.shtml

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

11.01.2012, 11:21:54 via Website

Dass ein paar Mb belegt werden ist ja irgendwie klar, aber 15Mb scheint mir doch ein wenig viel. Strings werden zum Zeitpunkt, wenn ich im Menü bin, eigentlich auch nicht viele geladen (weniger als 10). Danke für deine Bemühungen :)

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

11.01.2012, 11:34:14 via Website

Ansonsten lass dir den Speicher doch mal selbst ausgeben.
Ich könnte mir vorstellen, dass der Debug Monitor nur die Größe der VM anzeigt.

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Runtime.html

1Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();

Liefert den aktuell belegten Speicher.
Es gibt tatsächlich keine Methode mit der man den Wert direkt abfragen kann, daher könnte ich mir vorstellen, dass auch der Debug Monitor nur totalMemory anzeigt.

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

11.01.2012, 11:39:05 via Website

Ok, das werde ich mal ausführen (kann ich leider erst heut abend testen, dann werd ich mich wieder melden). Wenn da allerdings diegleichen Werte, wie im Debug-Mode stehen, dann wäre das doof :) Nochmal Danke und bis vll später

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

11.01.2012, 16:28:05 via Website

Ist doch etwas früher geworden. Also mit der Abfrage komme ich auch auf 14Mb. Vermutlich gibt dieser Aufruf auch nur den gesamt verbrauchten Speicher mit der VM aus. Das Problem wird aber dennoch irgendwo im Code liegen. Wahrscheinlich wird es irgendein simpler Fehler sein

Antworten