Android: Memory leak

shadow

Aktives Mitglied
Hallo,

ich habe Speicher-Probleme in meiner Android-App und habe diese auf folgende Funktion eingegrenzt:

Java:
    private String test(long value) {
        return "abc" + value;
    }

Zugegebenermaßen wird diese Funktion sehr oft aufgerufen, ich programmiere an einem Spiel und bei jedem zeichnen brauche ich die Funktion mehrmals...

Ich verstehe nur nicht, warum das so massiv Speicher braucht. Der Rückgabe-String der Funktion wird an canvas.drawText() übergeben und danach nicht mehr verwendet, d. h. ich selbst halte keine Referenzen auf den String. Ich habe ein bisschen damit rumgespielt und herausgefunden, dass folgendes überhaupt kein Problem ist:

Java:
    private String test(long value) {
        return "abc";
    }

Ok, hier wird das Autobixing gespart und es muss dadurch ein ein Long-Objekt weniger erzeugt werden, aber der "abc"-String wird auch hier erzeugt und die letzere Variante frisst meinen Speicher nicht im Geringsten auf...

Hat da jemand eine Idee?

Danke schonmal im Vorraus!
Stefan
 

Marco13

Top Contributor
Wie es im Detail bei der Dalvik-VM gelöst ist, ist schwer zu sagen, aber davon ausgehend, dass es gewisse Parallelen zur JVM gibt: Bei der JVM gibt es einen "String-Pool" für konstante Strings. Es könnte sein, dass die Dalvik auch einen für solche zusammengesetzen Strings hat. Wäre aber schon seltsam, wenn es ihn da wirklich raushauen würde. Kracht er mit einer OOME ab, oder geht es nur darum, dass er scheinbar immer mehr Speicher braucht...?
 

shadow

Aktives Mitglied
Danke für die Antwort!

Ich habe in meiner App eine kleine grafische Anzeige des belegten und verfügbaren Speichers. Das realisiere ich mit Runtime.getRuntime().freeMemory() etc...

Da sehe ich, dass innerhalb von ein paar Sekunden enorm viel Speicher verbraucht wird (das müssen mehrere MB sein), dann greift wohl irgendwann der GC und die Speicher ist wieder freigegeben. Das wiederholt sich über den gesamten Zeitraum des Programms.
Soweit ja erstmal kein Problem, wenn der Speicher immer wieder freigegeben werden kann. Aber einerseits frage ich mich, warum dieses Verhalten nur bei meinem ersten Code-Segment auffällt. Lasse ich das Autoboxing des long-Werts weg, bleibt der Speicher konstant. Und andererseits braucht meine App von Zeit zu Zeit viel Speicher auf einmal (große Bilder werden geladen), und dann fliegt die App mit meiner OOME weg, wenn gerade nicht genug Speicher da ist, was aber eigentlich der Fall wäre, wenn der Speicher nicht dieses Spielchen machen würde...
 

Marco13

Top Contributor
OK, einen OOME sollte es eigentlich nicht Fall geben, wenn es wirklich Speicher ist, der wieder freigegeben werden kann - und bei diesen "Müll-Strings", die nur einmal zusammengebaut und schnell wieder weggeworfen werden, sollte er das auf jeden Fall können. Ich bin selbst nicht sooo firm mit Android, eine Websuche liefert schnell sowas wie Track memory allocations | Android Developers Blog , vielleicht hilft das schon...?
Bist du sicher, dass er die Bilder laden kann, wenn zufällig gerade kurz vorher der GC gelaufen ist?
Ggf. müßte man mal eine Mini-Application zum Testen bauen, die wirklich nur Strings der Form "abc"+einLong zusammenbaut, und schauen, was der Speicher dort genau macht.
 
B

...ButAlive

Gast
Zitat von der Android-Developerseite (Designing for Performance):

Avoid Creating Unnecessary Objects
....
- If you have a method returning a string, and you know that its result will always be appended to a StringBuffer anyway, change your signature and implementation so that the function does the append directly, instead of creating a short-lived temporary object.

Übertragen auf dein Beispiel, übergebe deine Canvas der Methode, baue den String in der Methode zusammen und zeichne in der selben Methode.

Ich kenne die Dalvik-VM auch nicht im Detail, aber ich könnte mir vorstellen, dass der Speicher lokaler Variablen nachdem die Methode fertig ist einfach wieder freigegeben wird. Wenn du einen Wert zurück gibst, ist der GC für das Aufräumen zuständig. Der Garbage Collector wird auf Android wahrscheinlich wesentlich seltener laufen als bei einer "normalen" JVM, denn das würde ja Akku kosten.

Auf einer "normalen" JVM ist es egal von wo Speicher auf dem Heap allokiert wurde, da ist immer der Garbage Collector für die Speicherverwaltung zuständig. Deshalb gibt es keinen Unterschied zwischen "Objekt zurückgeben und dann etwas damit machen" und "Objekt nur lokal anlegen und in der selben Methode etwas damit machen".
 

shadow

Aktives Mitglied
@Marco13: Danke für die Links, ich werd mir das mal näher ansehen. Ich könnte jedenfalls versuchen, wirklich mal manuell den GC zu aktivieren, bevor ich ein Bild lade, um das zu testen. Bei Gelegenheit muss ich das noch tun, um herauszufinden, welche Exception das genau ist...

@...ButAlive: Danke auch für Deinen Link. Diese Kleinigkeit mit Canvas übergeben habe ich schnell getestet und leider hat sich da nichts geändert.

Sobald ich wieder Zeit finde, werde ich dem Thema noch einmal genauer nachgehen...
 

Lumaraf

Bekanntes Mitglied
Wenn dein value häufig Werte hat die mehr als 16 Zeichen im Ergebnissstring benötigen kannst du die Methode noch ein kleines bischen optimieren. Ich schätze mal 10% weniger Speicherverbrauch könnte man in dem Fall erreichen.

Java:
    private String test(long value) {
        return new StringBuilder("abc".length()+20).append("abc").append(value).toString();
    }

So gut wie alle Java Compiler erzeugen bei deinem Code zunächst einen StringBuilder mit der Kapazität ("abc".length()+16) Wenn dann versucht wird eine große long Zahl anzuhängen fehlt ein paar Zeichen im internen char[] und es wird ein größeres erzeugt und die Daten werden umkopiert. Das neue char[] hätte dann afaik eine größe von ("abc".length()+16)*2+2 was für deutlich mehr wäre als für das anhängen des values notwendig wäre.

Du solltest aber besser erstmal schauen ob du irgendwie mit weniger Aufrufen der Methode auch zum richtigen Ergebniss kommen kannst. Eventuell kannst du das Ergebniss ja einfach irgendwo Zwischenspeichern wenn es sich nicht bei jedem Rendern ändert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Benachrichtigung Freigabe ab Android 14 Android & Cross-Platform Mobile Apps 1
J Android Benachrichtigung zum Zeitpunkt ers Android & Cross-Platform Mobile Apps 15
J Das Beispiel von Android erzeugt Fehler Android & Cross-Platform Mobile Apps 8
J Zeitdifferenzen unter Android 7 (API < 26) berechnen Android & Cross-Platform Mobile Apps 4
W Netzwerk Verbindungen Java Android Android & Cross-Platform Mobile Apps 107
Z Android IntelliJ Android & Cross-Platform Mobile Apps 2
M Repository bei Room-Database in Android Studio (Java) Android & Cross-Platform Mobile Apps 2
Android App auf das eigene Handy bekommen Android & Cross-Platform Mobile Apps 3
Alex IV Android App erstellen Android & Cross-Platform Mobile Apps 3
OnDemand CrossPlatform Kotlin iOs/Android Datenverbrauch Android & Cross-Platform Mobile Apps 2
W In Android Studio Integer an andere activities übergeben Android & Cross-Platform Mobile Apps 2
wladp Android Studio Room Database Android & Cross-Platform Mobile Apps 1
N "Schöne" Datatable in Android und setzen von Parametern von Textview im Code Android & Cross-Platform Mobile Apps 5
N Android game programmieren Android & Cross-Platform Mobile Apps 5
T Android Studio: Einen Button in einer For Schleife verwenden Android & Cross-Platform Mobile Apps 2
K BLE Komunikation mit Android studio und esp32 Android & Cross-Platform Mobile Apps 5
G Android UDP Kommunikation Android & Cross-Platform Mobile Apps 1
M Paper DB wird in Android Studio nicht erkannt Android & Cross-Platform Mobile Apps 7
J Android zugrif auf Thread nach Handy drehen. Android & Cross-Platform Mobile Apps 10
T Android Android Augmented Faces in Java. Neue Landmarks erstellen Android & Cross-Platform Mobile Apps 1
K Android Android In-App-Purchase lädt nicht Android & Cross-Platform Mobile Apps 0
Besset Android http request an interne ip adresse funktioniert nicht Android & Cross-Platform Mobile Apps 8
J Is Android Development Head First Outdated? Android & Cross-Platform Mobile Apps 3
J Android Android Datenbankverbindung zum Raspberry Pi Android & Cross-Platform Mobile Apps 1
lolcore Android Studio -Download Documentation for Android SDK Android & Cross-Platform Mobile Apps 0
S Sinnvollste weg eine SQLite DB mit Android auslesen Android & Cross-Platform Mobile Apps 7
W Problem mit Android Studio Android & Cross-Platform Mobile Apps 0
W App Abo Android Android & Cross-Platform Mobile Apps 10
OSchriever Android Android MediaPlayer bei Anruf stoppen/pausieren Android & Cross-Platform Mobile Apps 2
OSchriever Auf onClick-Listener reagieren und Parameter übergeben (Android Studio) Android & Cross-Platform Mobile Apps 4
W removeNetwork Android App mit Spendenaktion fürs Tierheim! Android & Cross-Platform Mobile Apps 1
T Android R.string.test+i Problem Android & Cross-Platform Mobile Apps 2
P undefinierbarer Fehler Android Android & Cross-Platform Mobile Apps 8
T Android ArrayList sortieren mit 2 Werten ohne thencomparing , Wie? Android & Cross-Platform Mobile Apps 10
W Variable überschreiben (Android Studio) Android & Cross-Platform Mobile Apps 2
ruutaiokwu Android Selbst entwickelter SMTP-Client läuft auf PC, nicht aber auf Android Android & Cross-Platform Mobile Apps 9
ruutaiokwu Android Warum muss man bei Android Studio immer 2x auf "Run" klicken damit die App auf dem Gerät startet Android & Cross-Platform Mobile Apps 8
ruutaiokwu Android Wo das 'android.useAndroidX' property hinzufügen? Android & Cross-Platform Mobile Apps 8
ruutaiokwu Android In einem Android-“Spinner”-Element GLEICHZEITIG Bild (links) UND Text (rechts) anzeigen Android & Cross-Platform Mobile Apps 0
P Login und Registrierung Android Anzeige Android & Cross-Platform Mobile Apps 7
S Von JavaFx zu Android Android & Cross-Platform Mobile Apps 12
K Android to Pi | Websocket Problem Android & Cross-Platform Mobile Apps 3
ruutaiokwu Wie fügt man bei Android Studio .jar-Libraries zu einem Android-Java-Projekt hinzu? Android & Cross-Platform Mobile Apps 33
M Komponenten positionieren in Android Studio 3.6.3 Android & Cross-Platform Mobile Apps 1
M Android Studio - Property-Fenster einblenden Android & Cross-Platform Mobile Apps 1
M Android Studio - App auf dem Smartphone testen Android & Cross-Platform Mobile Apps 7
M Barrierefreie Appentwicklung für Android - Suche Codebeispiele Android & Cross-Platform Mobile Apps 8
M Android Studio - Configuration fehlt Android & Cross-Platform Mobile Apps 20
M Wo kann ich das Android SDK herunterladen / wie kann ich es installieren Android & Cross-Platform Mobile Apps 3
M Unsupported class file major version 57 - Fehlermeldung bei Android Studio Android & Cross-Platform Mobile Apps 27
ruutaiokwu Android Studio (SDK) ANDROID_SDK_ROOT-Variable? Android & Cross-Platform Mobile Apps 5
O Web API in Android (JAVA) einbinden Android & Cross-Platform Mobile Apps 3
J Android Studio macht seltsame Sachen Android & Cross-Platform Mobile Apps 2
J Android 9.1 aber android Studio findet API22 Android & Cross-Platform Mobile Apps 0
Dimax Web-Seite in native app convertieren mit Android Studio Android & Cross-Platform Mobile Apps 8
A Android Studio: while-Schleife beginnt nicht Android & Cross-Platform Mobile Apps 5
lolcore android studio: fehler bei laden des emulators Android & Cross-Platform Mobile Apps 10
J Android App - Browser öffnen und Text eingeben/Button click auslösen Android & Cross-Platform Mobile Apps 10
A Android-Studio: 2. Layout nach kurzer Zeit aufzeigen Android & Cross-Platform Mobile Apps 2
A jpg wird im Android Studio nicht akzeptiert Android & Cross-Platform Mobile Apps 3
J Android Studio - ArrayList - Selected Item ermitteln Android & Cross-Platform Mobile Apps 13
T Android SDK-Manager startet nicht in Eclipse Android & Cross-Platform Mobile Apps 5
T Bringen mir die Java-Basics irgendetwas für die Android-Programmierung Android & Cross-Platform Mobile Apps 4
J Was soll das bedeuten ? does not require android.permission.BIND_JOB_SERVICE permission Android & Cross-Platform Mobile Apps 7
A Android Studio: ImageView verpixelt Android & Cross-Platform Mobile Apps 2
J intend Service im Android Studio Android & Cross-Platform Mobile Apps 4
L Android Android Development eventuell mit Flutter Android & Cross-Platform Mobile Apps 1
S Android Layout - welchen Typ? Android & Cross-Platform Mobile Apps 3
T Fehler Android Studio: java.net.MalformedURLException: no protocol: http%3A%2F%2Fwww.mal ..... Android & Cross-Platform Mobile Apps 2
Arif Android Android Studio: Fehler beim Einbinden fremder Bibliothek? Android & Cross-Platform Mobile Apps 2
L Android Android Contacts DB auslesen Android & Cross-Platform Mobile Apps 1
A Android Studio - App mit Nearby Android & Cross-Platform Mobile Apps 1
L Android content URI Datei einlesen Android & Cross-Platform Mobile Apps 9
N Android Game Background Service Android & Cross-Platform Mobile Apps 11
Jackii Android Android Studio Error im Testlauf ohne zu programmieren Android & Cross-Platform Mobile Apps 9
B Android Probleme mit Android Studio Android & Cross-Platform Mobile Apps 6
Excess Android Service läuft nicht in Sandby weiter Android & Cross-Platform Mobile Apps 2
B Android Projekt für Android und IOS erstellen? Android & Cross-Platform Mobile Apps 5
J App funktioniert auf Android 5, auf 6 nicht Android & Cross-Platform Mobile Apps 2
J Android Snake Android & Cross-Platform Mobile Apps 15
J Android TaschenRechner Android & Cross-Platform Mobile Apps 22
I Das Problem mit der Tastatur... android:windowSoftInputMode="adjustPan" Android & Cross-Platform Mobile Apps 1
E Wie erhalte ich Zugriff auf das Microfon? (Android Studio) Android & Cross-Platform Mobile Apps 9
C Android Programmierung speziell oder einfach Java Buch kaufen? Android & Cross-Platform Mobile Apps 3
B Android Kein Zugriff auf Telefonspeicher (Android 6) Android & Cross-Platform Mobile Apps 1
T Android Equalizer für Android Android & Cross-Platform Mobile Apps 3
L Android Android Studio - Exportierte APK funktioniert nicht Android & Cross-Platform Mobile Apps 6
L Android Methode funktioniert nicht unter Android Android & Cross-Platform Mobile Apps 3
A Beginnen mit Serverkommunikatsion in Android Studio Android & Cross-Platform Mobile Apps 6
E Android Studio Android & Cross-Platform Mobile Apps 15
L Android Android Studio Setup killt Explorer Android & Cross-Platform Mobile Apps 3
K Android Videos rendern Android & Cross-Platform Mobile Apps 1
J Variable in strings.xml (Android Studio) Android & Cross-Platform Mobile Apps 0
B Android Android Studio lässt PC abstürzen Android & Cross-Platform Mobile Apps 3
B Android App Fehler Android & Cross-Platform Mobile Apps 21
J android Spinner funktioniert nicht Android & Cross-Platform Mobile Apps 14
G Android Push Notification Android & Cross-Platform Mobile Apps 2
Light Lux Fehlermeldung unter Android Studio Android & Cross-Platform Mobile Apps 1
D Android Android Apps direkt vom Handy aus programmieren? Android & Cross-Platform Mobile Apps 2
L Android Android Kalendar Tag Ansicht Android & Cross-Platform Mobile Apps 1

Ähnliche Java Themen

Neue Themen


Oben