Anzeige
In der Programmiersprache Java spielt String als eine unveränderliche (immutable) Klasse eine zentrale Rolle in der Speicherverwaltung sowie bei der Lebensdauer von Zeichenketten. Anknüpfend an die beiden vorangegangenen Beiträge Sicherere Passwörter mit Salt, Pepper und Hashing und Sichere Datenhaltung in der JVM – Risiken und Best Practices erläutert dieser Artikel nochmals detailliert die sich daraus für Entwicklerinnen und Entwickler ergebenden Konsequenzen beim sicheren Programmieren.
Aufgrund der Unveränderlichkeit der Klasse erzeugt jeder Versuch, einen String zu modifizieren, in Wirklichkeit eine neue Instanz, anstatt den ursprünglichen Wert zu verändern. Dieses Design führt dazu, dass String-Objekte effizient im String Pool verwaltet werden, einem speziellen Bereich im Heap-Speicher, in dem String-Literale gespeichert und wiederverwendet werden.
Ein neu deklariertes String-Literal wird standardmäßig im String Pool abgelegt. Falls bereits eine identische Zeichenkette existiert, wird die Referenz auf das existierende Objekt zurückgegeben, anstatt eine neue Instanz zu erzeugen. Diese Speicheroptimierung reduziert Redundanzen und minimiert den Speicherverbrauch.
Wird jedoch ein String-Objekt explizit mit new String("...") erzeugt, so wird ein separater Speicherbereich auf dem Heap angelegt, der unabhängig vom String Pool ist. Dies kann zu unerwartetem Speicherverbrauch führen, wenn viele solcher Objekte erzeugt werden. Die Garbage Collection entfernt nicht referenzierte String-Instanzen aus dem Heap, während der String Pool von der internen JVM-Optimierung abhängt, insbesondere durch die Methode intern().