Montag, September 11, 2006

new String(string) benutzen nur Anfänger?

Kann man sich in Java mit vielen 4 Zeichen langen Strings ein Speicherproblem schaffen?
Klar, wenn man ca. (Speichergröße in Byte / 4) Strings hat.

Weit gefehlt.
Es geht auch anders, wenn man nicht alles über Strings weiß.

Ein Beispiel, das uns ca. 3 Manntage Forschungsarbeit gekostet hat:
Man importiert eine mehrere GB große Datei Zeile für Zeile, parst die Zeilen in die Datenbank und merkt sich nur die 4 Zeichen langen Kennziffern der Zeilen, damit man doppelte Aktionen vermeiden kann.

Was gibt es da über Strings zu wissen? Und wo soll der Speicher verloren gehen, wenn man die Zeile nur innerhalb der Schleife kennt?

Ein String ist ein Objekt, das seinen Text als Auszug aus einem char[] speichert. Wenn man jetzt die ca. 2 KB langen Zeilen der Importdatei
mit substring() zerlegt, werden die Substrings nicht mit einem neuen char[] erzeugt, sondern zeigen auf den gleichen Array mit einem entsprechenden Offset. Eine super Idee, um Speichermüll zu vermeiden.
Aber wenn man - wie wir - einen der Substrings dauerhaft im Speicher hält (Map, etc.), behält man auch dauerhaft den dahinter hängenden char[]. Und das führt zu 2KB unnötigem Speicherverbrauch pro Zeile.

Die Lösung des Problems sieht dann aus wie Anfängercode:
String kennziffer = new String(zeile.substring(0,4));
Durch new String() wird tatsächlich auch ein neuer char[] für die 4 Zeichen erzeugt und schon hat man keine Probleme mehr.

new String(string) ist normalerweise vollkommen nutzlos, weil Strings unveränderlich sind, und sollte aus Speichergründen nicht verwendet werden. Aber wenn man große Strings mit substring() zerlegt, sollte man es in Erwägung ziehen.

rathergood B3ta Flash

Und heute mal ein paar musikalische Highlights aus den Flash-Schmieden von Rathergood und B3ta:

Hey hey 16k - Ode an die alten Homecomputer
We Like the Moon - mein Gutelaunelied (für die optimale Wirkung am besten drei mal laufen lassen)
Bukkake - mit diesem Lied im Ohr wird das Surfen auf Pornoseiten wenigstens erträglich
Sleepy Kittens - einer für den Morgen nach der Party