Leistung des permanenten Speichers

Der permanente Speicher ist im Anwendungsspeicher vorhanden. Es gibt mehr Latenz beim Schreiben in einen Anwendungsspeicher als beim Lesen aus einem Anwendungsspeicher. Das Lesen erfolgt aus dem permanenten Speicher mit einer relativ hohen Geschwindigkeit, während Commits relativ langsam durchgeführt werden.

Bewährtes Verfahren: Verwenden einer effizienten Datenstrukturauswahl

Die Datenstrukturauswahl definiert, wie viele Objekt-Handles und wie viel Flash-Speicher eine Anwendung nutzt. Durch eine falsche Datenstrukturauswahl werden wichtige Ressourcen belegt, ohne den Funktionsumfang oder die Arbeitsumgebung zu verbessern.

Befolgen Sie die folgenden Anweisungen:

  • Die Datenstruktur sollte aus der kleinstmöglichen Anzahl an Objekten bestehen, insbesondere wenn Sie Objekte auf höheren Ebenen verwenden, wie Vector oder Hashtable. Diese Klassen bieten wichtige Funktionen, sind aber keine effizienten Speichermethoden: Sie sollten möglichst darauf verzichten, sie im permanenten Speicher zu verwenden.
  • Nutzen Sie nach Möglichkeit Primitive anstelle von Objekten, weil Primitive die Anzahl von Objekt-Handles verringern, die auf dem Smartphone belegt werden. Ein Array mit Primitiven ist ein Objekt und verwendet ein Objekt-Handle.
  • String-Objekte sind ebenso effizient wie Bytearrays. Ein String-Objekt verwendet nur ein Objekt-Handle und ist gleichwertig, wenn Ihre Anwendung alle Zeichen als ein Byte speichert. Anders gesagt: Der Wert von jedem Zeichen ist kleiner oder gleich dem Dezimalwert 255. Wenn Ihre Anwendung die Zeichen nicht als ein Byte speichern kann, können Sie die Zeichen als String speichern, was dem Speichern eines char-Arrays entspricht.

Bewährtes Verfahren: Schonen von Objekt-Handles

Einer der häufigsten Fehler, denen Anwendungsentwickler begegnen, ist der Mangel an permanenten Objekt-Handles. Die Größe des Anwendungsspeicherplatzes auf dem Smartphone bestimmt die feste Anzahl permanenter Objekt-Handles, die im System verfügbar sind. Abhängig von der Datenstrukturauswahl können gespeicherte Datensätze schnell die Anzahl der permanenten Objekt-Handles ausschöpfen. Ein permanentes Objekt verwendet ein permanentes Objekt-Handle und ein Objekt-Handle. Ein vergängliches Objekt verwendet nur ein Objekt-Handle.

Ein Datensatz, der zehn String-Felder enthält, die für Elemente wie Name, Telefonnummer und Adresse stehen, verwendet beispielsweise 11 permanente Objekt-Handles, einen für das Datensatzobjekt und einen für jeden String. Wenn in einer Anwendung 3.000 Datensätze gespeichert sind, nutzt die Anwendung 33.000 permanente Objekt-Handles, was die Anzahl der verfügbaren permanenten Objekt-Handles auf einem Smartphone, das 16 MB Flash-Speicher besitzt, übersteigt.

Sie können die net.rim.device.api.system.ObjectGroup-Klasse verwenden, um die Objekt-Handles für ein Objekt in einer Gruppe zu konsolidieren. Für das obige Beispiel ergibt sich: Wenn Sie den Datensatz gruppieren, belegt der Datensatz nur noch einen permanenten Objekt-Handle (statt wie bisher elf). Die Objekt-Handles für die String-Felder werden unter dem Objekt-Handle des Datensatzes konsolidiert.

Wenn Sie Objekt-Handles zu einer Gruppe konsolidieren, ist das Objekt-Handle schreibgeschützt. Falls Sie Änderungen am Objekt vornehmen möchten, müssen Sie die Gruppierung zuerst aufheben. Sobald alle Änderungen erledigt sind, gruppieren Sie das Objekt wieder. Wenn Sie versuchen, ein gruppiertes Objekt zu ändern, ohne die Gruppierung zuerst aufzuheben, wird die Ausnahme ObjectGroupReadOnlyException ausgelöst.

Das Aufheben der Gruppierung eines Objekts wirkt sich auf die Leistung aus. Das System erstellt eine Kopie des gruppierten Objekts und weist den einzelnen Objekten in der Gruppe jeweils einen Handle zu. Deshalb sollten Sie die Gruppierung von Objekten nur dann aufheben, wenn dies unbedingt nötig ist.

Es ist möglich, Commits zum permanenten Speicher während eines Garbage Collection-Vorgangs ohne einen expliziten commit() durchzuführen. Das Gruppieren von Objekten sollte daher immer vor Aufrufen von setContents() oder commit() stattfinden. Weitere Informationen zum Gruppieren von Objekten finden Sie unter net.rim.device.api.system.ObjectGroup.

Bereinigung von permanenten Objekten

Wenn eine Anwendung von einem BlackBerry-Smartphone entfernt wird, werden permanente Objekte, die innerhalb der Anwendung definiert sind, automatisch gelöscht. Der Grund dafür liegt darin, dass jedes dauerhafte Objekt über einen Klassentyp verfügt, der in der Anwendung definiert ist. Wenn die Anwendung entfernt wird, wird der Klassentyp und somit auch das permanente Objekt gelöscht.

Um sicherzustellen, dass die Bereinigung des von Ihnen verwendeten permanenten Speichers durchgeführt wird, sollten Sie immer Ihre eigenen Instanzenklassen oder Ihre eigenen Erweiterungen von bereitgestellten Klassen speichern.

Um einzelne Daten zu löschen, behandeln Sie die Daten als normale Objekte und entfernen Sie deren Referenzen. Ein Garbage Collection-Vorgang entfernt die Daten.


Waren diese Informationen hilfreich? Senden Sie uns Ihren Kommentar.