Optimized Strings for the Java HotSpot™ VM

Christian Häubl
Institute for System Software
haeubl@ssw.jku.at


Abstract

Each string in Java consists of two separate objects. Metadata such as the length of the string are stored in the string object. For storing the characters, a separate character array is used. This separation results in increased memory usage and bad cache behavior because string operations must access both objects.

The optimization presented in this thesis merges the string object and the character array into a single object. Such an optimized string has a better cache behavior and requires less memory. The optimization is implemented for Sun Microsystems' Java HotSpot™ VM and is automatically applied at run time. The class String is optimized manually and all methods that allocate string objects are modified at run time. The modification at run time is performed once when loading a class and impacts the performance only negligibly.

Several benchmarks show a reduction of the memory usage and a performance increase. For the SPECjbb2005 benchmark, the performance increases by 8% and the memory usage is reduced by 3%. The performance of the DaCapo benchmarks improves by up to 14% (4% on average) and the memory usage is reduced by 5% on average. For the SPECjvm98 benchmarks, the performance improves by up to 62% (8% on average).

Kurzfassung

Jeder String in Java besteht aus zwei separaten Objekten. Metadaten wie die Länge des Strings werden im String Objekt gespeichert. Die Zeichen sind in einem eigenen Character Array gespeichert. Diese Aufteilung führt zu einem erhöhten Speicherbedarf und zu einem schlechten Cache Verhalten, da für String Operationen auf beide Objekte zugegriffen werden muss.

Die in dieser Diplomarbeit vorgestellte Optimierung verschmilzt das String Objekt und das Character Array zu einem Objekt. Dieser optimierte String hat ein besseres Cache Verhalten und benötigt weniger Speicher. Die Optimierung ist für Sun Microsystems' Java HotSpot™ VM implementiert und wird automatisch zur Laufzeit durchgeführt. Die Klasse String wird manuell optimiert und es werden alle Methoden, die String Objekte allokieren, zur Laufzeit modifiziert. Diese Modifikation zur Laufzeit erfolgt einmalig beim Laden einer Klasse und hat daher einen vernachlässigbaren Einfluss auf die Geschwindigkeit.

Mehrere Benchmarks zeigen eine Reduktion des Speicherbedarfs und eine Steigerung der Geschwindigkeit. Beim SPECjbb2005 Benchmark steigt die Geschwindigkeit um 8% und der Speicherbedarf wird um 3% reduziert. Die Geschwindgkeit der DaCapo Benchmarks steigt um bis zu 14% (durchschnittlich 4%) und der Speichbedarf reduziert sich um durchschnittlich 5%. Bei den SPECjvm98 Benchmarks verbessert sich die Geschwindigkeit um bis zu 64% (durchschnittlich 8%).


Master's thesis, Johannes Kepler University Linz, June 2008

Download as PDF