Kompakte Zeichenfolgen in Java 9

Hallo nochmal! Wir haben das nächste Set in der nunmehr neunten Gruppe „Java Developer“ eröffnet (und die zehnte Gruppe in den Plänen steht plötzlich am 31. Dezember) und haben interessante Materialien und eine offene Lektion für Sie vorbereitet.

Also lass uns gehen.

Möchten Sie den von Ihrer Java-Anwendung verwendeten Speicher reduzieren? Erfahren Sie, wie Sie die Leistung mit den in Java 9 verfügbaren kompakten Zeichenfolgen verbessern können.

Eine der Leistungsverbesserungen, die in der JVM (genauer gesagt Oracle HotSpot) als Teil von Java SE 9 eingeführt wurden, erwiesen sich als kompakte Zeichenfolgen. Ihre Aufgabe besteht darin, die Größe von String-Objekten zu reduzieren, wodurch die Gesamtmenge (Footprint) des von der Anwendung verbrauchten Speichers reduziert werden kann. Dies kann den Zeitaufwand für das Sammeln von Müll verringern.



Die Funktion basiert auf der Beobachtung, dass viele String-Objekte nicht 2 Bytes benötigen, um jedes Zeichen zu codieren, da die meisten Anwendungen nur Latin-1-Zeichen verwenden. Deshalb stattdessen:

/**       */ private final char value[]; 

In java.lang.String jetzt java.lang.String :

 private final byte[] value; /** *        * {@code value}.      : * * LATIN1 * UTF16 * * @implNote     .    * “”,   String - .   *      . */ private final byte coder; 

Mit anderen Worten, diese Funktion ersetzt den Wert im char Array (wobei jedes Element 2 Bytes verwendet) durch ein Byte-Array mit einem zusätzlichen Byte, um die Codierung zu bestimmen (Latin-1 oder UTF-16). Dies bedeutet, dass in den meisten Anwendungen, in denen nur lateinische 1-Zeichen verwendet werden, nur die Hälfte des Heaps verwendet wird. Der Benutzer wird die Unterschiede nicht bemerken, aber verwandte APIs wie StringBuilder nutzen dies automatisch aus.

Um diese Änderung in Bezug auf die Größe des String-Objekts anzuzeigen, verwende ich Java Object Layout, ein einfaches Dienstprogramm zur Visualisierung der Struktur des Objekts auf dem Heap. Unter diesem Gesichtspunkt interessieren wir uns für den Footprint des Arrays (gespeichert in der obigen Wertvariablen) und nicht nur für eine Referenz (eine Byte-Array-Referenz verwendet wie eine Zeichen-Array-Referenz 4 Bytes). Der folgende Code zeigt die Informationen mit JOL GraphLayout :

 public class JOLSample { public static void main(String[] args) { System.out.println(GraphLayout.parseInstance("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz").toFootprint()); } } ) ToFootprint ()); public class JOLSample { public static void main(String[] args) { System.out.println(GraphLayout.parseInstance("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz").toFootprint()); } } 

Das Ausführen des obigen Codes in Java 8 und dann in Java 9 zeigt den Unterschied:

 $java -version java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) $java -cp lib\jol-cli-0.9-full.jar;. test.JOLSample java.lang.String@4554617cd footprint: COUNT AVG SUM DESCRIPTION 1 432 432 [C 1 24 24 java.lang.String 2 456 (total) ... $java -version java version "9" Java(TM) SE Runtime Environment (build 9+181) Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode) $java -cp lib\jol-cli-0.9-full.jar;. test.JOLSample java.lang.String@73035e27d footprint: COUNT AVG SUM DESCRIPTION 1 224 224 [B 1 24 24 java.lang.String 2 248 (total) 

Wenn wir die 24-Byte-Größe der internen Komponenten von java.lang.String (Header plus Links) ignorieren, sehen wir, dass sich die Größe aufgrund ihrer Kompaktheit um fast die Hälfte verringert hat.
Wenn wir die obige Zeile durch eine andere mit UTF-16-Zeichen ersetzen, z. B. \ u0780, und dann den obigen Code neu starten, zeigen sowohl Java 8 als auch Java 9 den gleichen Footprint, da die Kompaktheit nicht mehr verwendet wird.

Sie können diese Funktion deaktivieren, indem Sie den -XX:-CompactStrings an den Befehl java .

Wie immer warten wir hier auf Ihre Kommentare und Fragen und laden Sie zu einer offenen Lektion ein .

Source: https://habr.com/ru/post/de426621/


All Articles