- Forum-Beiträge: 5.136
20.06.2009, 00:21:54 via Website
20.06.2009 00:21:54 via Website
Kurz zur Geschichte:
In der heutigen Zeit begegnet einem als Programmierer immer öfter Software, die sich aufgrund der stark gesunkenen Speicherpreise in keinster Weise mehr um Dinge wie Heap, Memory und Rechenleistung kümmern. Standardargument der meisten Programmierer : Ist ja eh genug Mem vorhanden .. da brauch ich mich heutzutage nicht mehr drum kümmern.
Stimmt das so ?
Nun ja .. das ist so ein Ding mit dem Speicher ... Theoretisch hat der Entwickler schon recht.
ABER: Meistens vergessen die Entwickler dabei zwei wesentliche Dinge. Erstens bewegt man sich heutzutage meistens in multiuser/multitasking Umgebungen.
Das bedeutet : Ich teile meinen Applikationsspeicher mit anderen Applikationen und/oder Threads, ausserdem belaste ich den Garbage Collector der JVM (Java Virtuellen Maschine) .
Ein Segen von Java, nämlich die Objektorientierung, kann in kritischen Fällen hier zum echten Hund werden. Einerseits gepriesen und viel verwendet, kann andererseits die gefankenlose Verwendung von Objekten schnell zum echten Speicherfresser werden. So Objekte können nämlich bei schlechter Planung ganz schnell ganz groß werden, ohne das man das im Single-User Testfall zunächst bemerkt.
Aber ich will nun nicht zu weit ins theoretische abschweifen ... zurück zum Thema.
Was kann ich also tun:
Zunächst etwas sehr simples, die eigene Anwendung zur rechten Zeit korrekt beenden und somit der JVM
erlauben aufzuräumen. Konkret also dem Garbage Collector zu ermöglichen, benötigen Speicher von nicht mehr
benötigten Variablen, Objekten und so weiter freizuräumen.
Den korrekten Zeitpunkt, wann eine App. beendet werden kann sollte jeder Programmierer kennen. Grob dann, wenn
die App. alle Aufgaben erledigt hat und die Lifetime der Activity beendet ist.
Wie das korrekt geht:
Ganz einfach, an der oder den richtigen Stellen eines oder beides der folgenden Dinge tun:
1. Aufruf der Methode
Die Methode ist aus dem Paket android.app.Activity und propagiert das Ende der Activity an mögliche Aufrufer. Bestenfalls also an
das Betriebssystem selbst. Jedenfalls werden hiernach die benutzten Ressourcen finalisiert und freigegeben.
Es gibt auch noch Methoden um andere Activitys zu beenden, bzw. diese Events abzufragen. Darum soll es hier aber nicht gehen.
2. Zusätzlich kann man noch
Diese Methode aus dem Paket java.lang.System beendet relativ hart die momentane JVM und gibt Ressourcen wieder frei.
Ruft man vorher noch runFinalizersOnExit(true); auf, werden vor dem beenden der App. sämtliche Objekte hart vom
Garbage Collector erfasst, dereferenziert und finalisiert. Das sollte allerdings nur in echten Härtefällen
erfolgen, da ein Garbage Collector Lauf ein sogenanntes Dead Second bewirkt. Die Dead Second bedeutet nichts anderes
als das während des Garbage Collector Laufs die gesamte JVM STEHT weil nichts anderes mehr geht und NUR GC betrieben
wird. Dieser Prozess hat in jeder JVM TOP Priorität und kann in Härtefällen schon mal mehrere Minuten dauern.
Also VORSICHT mit dieser Option, auch wenn sie sicher alles wegputzt.
Also Leute .. finish(); und System.exit(0); tun nicht weh, das geht sogar in EINER ZEILE ... ;)
Warum ist das auf Systemen wie dem Android so wichtig?
Garbage Collection bedeutet CPU Zeit, Cpu Zeit = AkkuLeistung und AKKU .. hamma wenig
Wenig Speicher bedeutet mehr Garbage Collection, mehr Garbage Collection mehr CPU ... usw.
Ihr seht, dass sich soetwas sehr schnell aufschaukeln kann. Also denkt auch an Euer Android
und den armen Akku. Aber vor allem an die User die sich ärgern warum das Ding wieder mal
so elendiglich langsam geworden ist. Es liegt (vielleicht) auch mit an Euch ;)
In diesem Sinne, happy coding.
Nächstes Mal beschreibe ich dann wie man völlig simple mal nen Quit Menü in seine Apps einbauen
kann. Bis dahin ..
lg
voss
lg Voss
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.