128
Was jeder Java-Entwickler ¨ uber Strings wissen sollte Was jeder Java-Entwickler ¨ uber Strings wissen sollte Bernd M¨ uller 19.4.2016 Bernd M¨ uller 19.4.2016 1/60

Was jeder Java-Entwickler über Strings wissen sollte

Embed Size (px)

Citation preview

Page 1: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Was jeder Java-Entwickler uberStrings wissen sollte

Bernd Muller

19.4.2016

,Bernd Muller 19.4.2016 1/60

Page 2: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Vor vielen, vielen Jahren . . .

Vor vielen, vielen Jahren . . .

,Bernd Muller 19.4.2016 2/60

Page 3: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Vor vielen, vielen Jahren . . .

Vor vielen, vielen Jahren . . .

public class HelloWorld {

public static void main(String [] args) {

System.out.println("Hello World");

}

}

,Bernd Muller 19.4.2016 3/60

Page 4: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Vor vielen, vielen Jahren . . .

Vor vielen, vielen Jahren . . .

public class HelloWorld {

public static void main(String [] args) {

System.out.println("Hello World");

}

}

Was ist”String[]“ ?

Was ist””Hello World”“ ?

Hat das irgend etwasmiteinander zu tun ?

,Bernd Muller 19.4.2016 3/60

Page 5: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Referent

Vorstellung Referent

I Prof. Informatik (Ostfalia, HS Braunschweig/Wolfenbuttel)

I Buchautor (JSF, Seam, JPA, ...)

I Mitglied EGs JSR 344 (JSF 2.2) und JSR 338 (JPA 2.1)

I Geschaftsfuhrer PMST GmbH

I . . .

,Bernd Muller 19.4.2016 4/60

Page 6: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Motivation

Motivation

,Bernd Muller 19.4.2016 5/60

Page 7: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Motivation

,Bernd Muller 19.4.2016 6/60

Page 8: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Motivation

� �

,Bernd Muller 19.4.2016 7/60

Page 9: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Motivation

Auszug aus Abschnitt String Interning

”Strings are, far and away, the most common Java

object; your application’s heap is almost certainly filledwith them.“

,Bernd Muller 19.4.2016 8/60

Page 10: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Motivation

,Bernd Muller 19.4.2016 9/60

Page 11: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Motivation

'

&

$

%

,Bernd Muller 19.4.2016 10/60

Page 12: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Motivation

,Bernd Muller 19.4.2016 11/60

Page 13: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Motivation

'

&

$

%

,Bernd Muller 19.4.2016 12/60

Page 14: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

String-Klassen

String-Klassen und -Methoden

,Bernd Muller 19.4.2016 13/60

Page 15: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

String-Klassen

Klassen mit String-Bezug: die ublichen Verdachtigen

I java.lang.String, seit Java 1.0The String class represents character strings.

I java.lang.StringBuffer, seit Java 1.0A thread-safe, mutable sequence of characters.

I java.lang.StringBuilder, seit Java 5A mutable sequence of characters.

I java.util.StringTokenizer, seit Java 1.0The string tokenizer class allows an application to break astring into tokens.

I java.util.StringJoiner, seit Java 8StringJoiner is used to construct a sequence of charactersseparated by a delimiter . . .

,Bernd Muller 19.4.2016 14/60

Page 16: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

String-Klassen

Klassen mit String-Bezug: die ublichen Verdachtigen

I java.lang.String, seit Java 1.0The String class represents character strings.

I java.lang.StringBuffer, seit Java 1.0A thread-safe, mutable sequence of characters.

I java.lang.StringBuilder, seit Java 5A mutable sequence of characters.

I java.util.StringTokenizer, seit Java 1.0The string tokenizer class allows an application to break astring into tokens.

I java.util.StringJoiner, seit Java 8StringJoiner is used to construct a sequence of charactersseparated by a delimiter . . .

,Bernd Muller 19.4.2016 14/60

Page 17: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

String-Klassen

Klassen mit String-Bezug: die ublichen Verdachtigen

I java.lang.String, seit Java 1.0The String class represents character strings.

I java.lang.StringBuffer, seit Java 1.0A thread-safe, mutable sequence of characters.

I java.lang.StringBuilder, seit Java 5A mutable sequence of characters.

I java.util.StringTokenizer, seit Java 1.0The string tokenizer class allows an application to break astring into tokens.

I java.util.StringJoiner, seit Java 8StringJoiner is used to construct a sequence of charactersseparated by a delimiter . . .

,Bernd Muller 19.4.2016 14/60

Page 18: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

String-Klassen

Klassen mit String-Bezug: die ublichen Verdachtigen

I java.lang.String, seit Java 1.0The String class represents character strings.

I java.lang.StringBuffer, seit Java 1.0A thread-safe, mutable sequence of characters.

I java.lang.StringBuilder, seit Java 5A mutable sequence of characters.

I java.util.StringTokenizer, seit Java 1.0The string tokenizer class allows an application to break astring into tokens.

I java.util.StringJoiner, seit Java 8StringJoiner is used to construct a sequence of charactersseparated by a delimiter . . .

,Bernd Muller 19.4.2016 14/60

Page 19: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

String-Klassen

Klassen mit String-Bezug: die ublichen Verdachtigen

I java.lang.String, seit Java 1.0The String class represents character strings.

I java.lang.StringBuffer, seit Java 1.0A thread-safe, mutable sequence of characters.

I java.lang.StringBuilder, seit Java 5A mutable sequence of characters.

I java.util.StringTokenizer, seit Java 1.0The string tokenizer class allows an application to break astring into tokens.

I java.util.StringJoiner, seit Java 8StringJoiner is used to construct a sequence of charactersseparated by a delimiter . . .

,Bernd Muller 19.4.2016 14/60

Page 20: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

String-Klassen

Padding

I Padding in der Regel mit Apache Commons-LangStringUtils: leftPad(), rightPad()

I Man benotigt aber keine Bibliothek, ist im SDK eingebaut

I Schlussel: java.util.Formatter als printf-Nachahmung

I Beispiel:

String.format("%1$10s", "hello")

String.format("%1$-10s", "hello")

,Bernd Muller 19.4.2016 15/60

Page 21: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

String-Klassen

Padding

I Padding in der Regel mit Apache Commons-LangStringUtils: leftPad(), rightPad()

I Man benotigt aber keine Bibliothek, ist im SDK eingebaut

I Schlussel: java.util.Formatter als printf-Nachahmung

I Beispiel:

String.format("%1$10s", "hello")

String.format("%1$-10s", "hello")

,Bernd Muller 19.4.2016 15/60

Page 22: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

String-Klassen

Padding

I Padding in der Regel mit Apache Commons-LangStringUtils: leftPad(), rightPad()

I Man benotigt aber keine Bibliothek, ist im SDK eingebaut

I Schlussel: java.util.Formatter als printf-Nachahmung

I Beispiel:

String.format("%1$10s", "hello")

String.format("%1$-10s", "hello")

,Bernd Muller 19.4.2016 15/60

Page 23: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Character-Codierungen

Character-Codierungen

,Bernd Muller 19.4.2016 16/60

Page 24: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Character-Codierungen

Character-Codierungen

I Historisch Java mit 16 Bit codiertem char-Datentyp

I Mit Java 5 wurde Unicode 4.0 als Character-Codierungeingefuhrt [CHAR1]

I Damit Codierungen mit mehr als 16 Bit moglich, die alssogenannte Surrogate reprasentiert werden

,Bernd Muller 19.4.2016 17/60

Page 25: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Character-Codierungen

Character-Codierungen

I Historisch Java mit 16 Bit codiertem char-Datentyp

I Mit Java 5 wurde Unicode 4.0 als Character-Codierungeingefuhrt [CHAR1]

I Damit Codierungen mit mehr als 16 Bit moglich, die alssogenannte Surrogate reprasentiert werden

,Bernd Muller 19.4.2016 17/60

Page 26: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Character-Codierungen

Character-Codierungen

I Historisch Java mit 16 Bit codiertem char-Datentyp

I Mit Java 5 wurde Unicode 4.0 als Character-Codierungeingefuhrt [CHAR1]

I Damit Codierungen mit mehr als 16 Bit moglich, die alssogenannte Surrogate reprasentiert werden

,Bernd Muller 19.4.2016 17/60

Page 27: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Character-Codierungen

Java Tutorial: Supplementary Characters as Surrogates

”To support supplementary characters without changing the char

primitive data type and causing incompatibility with previous Javaprograms, supplementary characters are defined by a pair of codepoint values that are called surrogates. The first code point is fromthe high surrogates range of U+D800 to U+DFBB, and thesecond code point is from the low surrogates range of U+DC00 toU+DFFF. For example, the Deseret character LONG I, U+10400,is defined with this pair of surrogate values: U+D801 andU+DC00.“ [CHAR2]

,Bernd Muller 19.4.2016 18/60

Page 28: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Character-Codierungen

Character-Codierungen (cont’d)

I Beschreibung in Java-Doc java.lang.Character [CHAR4]

I UberblickI Java 1.4: Unicode 3.0I Java 5: Unicode 4.0I Java 6: Unicode 4.0I Java 7: Unicode 6.0.0I Java 8: Unicode 6.2.0I Java 9: Unicode 8.0.0

I Basic Encodings in lib/rt.jar, Extended Encodings inlib/charsets.jar, Dokumentation in [CHAR3]

,Bernd Muller 19.4.2016 19/60

Page 29: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Character-Codierungen

Character-Codierungen (cont’d)

I Beschreibung in Java-Doc java.lang.Character [CHAR4]

I UberblickI Java 1.4: Unicode 3.0I Java 5: Unicode 4.0I Java 6: Unicode 4.0I Java 7: Unicode 6.0.0I Java 8: Unicode 6.2.0I Java 9: Unicode 8.0.0

I Basic Encodings in lib/rt.jar, Extended Encodings inlib/charsets.jar, Dokumentation in [CHAR3]

,Bernd Muller 19.4.2016 19/60

Page 30: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Character-Codierungen

Character-Codierungen (cont’d)

I Beschreibung in Java-Doc java.lang.Character [CHAR4]

I UberblickI Java 1.4: Unicode 3.0I Java 5: Unicode 4.0I Java 6: Unicode 4.0I Java 7: Unicode 6.0.0I Java 8: Unicode 6.2.0I Java 9: Unicode 8.0.0

I Basic Encodings in lib/rt.jar, Extended Encodings inlib/charsets.jar, Dokumentation in [CHAR3]

,Bernd Muller 19.4.2016 19/60

Page 31: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Performanz

Performanz

,Bernd Muller 19.4.2016 20/60

Page 32: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Performanz

Performanz: toString()

Performanz: toString()

,Bernd Muller 19.4.2016 21/60

Page 33: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Performanz

Performanz: toString()

Who Cares About toString Performance ?

I Blog von Antonio Goncalves [Gonc]

I Use Case: Großer Batch mit Logging und toString(), o.a.

I Effective Java [Joshua Bloch]Item 10: Always override toString

I toString()-Methode durch IDE generiert oder selbstgemacht mit Alternativen

I Null-Checks nicht vergessen

I Untersucht: JDK, Guava, CommonsLang3

I Gemessen:”Average performance with Java

Microbenchmarking Harness (ops/s)“

,Bernd Muller 19.4.2016 22/60

Page 34: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Performanz

Performanz: toString()

Who Cares About toString Performance ?

I Blog von Antonio Goncalves [Gonc]

I Use Case: Großer Batch mit Logging und toString(), o.a.

I Effective Java [Joshua Bloch]Item 10: Always override toString

I toString()-Methode durch IDE generiert oder selbstgemacht mit Alternativen

I Null-Checks nicht vergessen

I Untersucht: JDK, Guava, CommonsLang3

I Gemessen:”Average performance with Java

Microbenchmarking Harness (ops/s)“

,Bernd Muller 19.4.2016 22/60

Page 35: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Performanz

Performanz: toString()

Who Cares About toString Performance ?

I Blog von Antonio Goncalves [Gonc]

I Use Case: Großer Batch mit Logging und toString(), o.a.

I Effective Java [Joshua Bloch]Item 10: Always override toString

I toString()-Methode durch IDE generiert oder selbstgemacht mit Alternativen

I Null-Checks nicht vergessen

I Untersucht: JDK, Guava, CommonsLang3

I Gemessen:”Average performance with Java

Microbenchmarking Harness (ops/s)“

,Bernd Muller 19.4.2016 22/60

Page 36: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Performanz

Performanz: toString()

Who Cares About toString Performance ?

I Blog von Antonio Goncalves [Gonc]

I Use Case: Großer Batch mit Logging und toString(), o.a.

I Effective Java [Joshua Bloch]Item 10: Always override toString

I toString()-Methode durch IDE generiert oder selbstgemacht mit Alternativen

I Null-Checks nicht vergessen

I Untersucht: JDK, Guava, CommonsLang3

I Gemessen:”Average performance with Java

Microbenchmarking Harness (ops/s)“

,Bernd Muller 19.4.2016 22/60

Page 37: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Performanz

Performanz: toString()

Who Cares About toString Performance ?

I Blog von Antonio Goncalves [Gonc]

I Use Case: Großer Batch mit Logging und toString(), o.a.

I Effective Java [Joshua Bloch]Item 10: Always override toString

I toString()-Methode durch IDE generiert oder selbstgemacht mit Alternativen

I Null-Checks nicht vergessen

I Untersucht: JDK, Guava, CommonsLang3

I Gemessen:”Average performance with Java

Microbenchmarking Harness (ops/s)“

,Bernd Muller 19.4.2016 22/60

Page 38: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Performanz

Performanz: toString()

Who Cares About toString Performance ?

I Blog von Antonio Goncalves [Gonc]

I Use Case: Großer Batch mit Logging und toString(), o.a.

I Effective Java [Joshua Bloch]Item 10: Always override toString

I toString()-Methode durch IDE generiert oder selbstgemacht mit Alternativen

I Null-Checks nicht vergessen

I Untersucht: JDK, Guava, CommonsLang3

I Gemessen:”Average performance with Java

Microbenchmarking Harness (ops/s)“

,Bernd Muller 19.4.2016 22/60

Page 39: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Performanz

Performanz: toString()

Who Cares About toString Performance ?

I Blog von Antonio Goncalves [Gonc]

I Use Case: Großer Batch mit Logging und toString(), o.a.

I Effective Java [Joshua Bloch]Item 10: Always override toString

I toString()-Methode durch IDE generiert oder selbstgemacht mit Alternativen

I Null-Checks nicht vergessen

I Untersucht: JDK, Guava, CommonsLang3

I Gemessen:”Average performance with Java

Microbenchmarking Harness (ops/s)“

,Bernd Muller 19.4.2016 22/60

Page 40: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Performanz

Performanz: toString()

Who Cares About toString Performance ? (cont’d)

Ergebnisse

Technic Average ops/s

String concat with + 142.075,167String builder 141.463,438Objects.toString 140.791,365Guava 110.111,808ToStringBuilder (append) 75.165,552ToStringBuilder (reflectionToString) 34.930,630ReflectionToStringBuilder 23.204,479

,Bernd Muller 19.4.2016 23/60

Page 41: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Performanz

Performanz: toString()

Who Cares About toString Performance? (cont’d)

Zusammenfassung:

”Today with the JVM optimisation, we can safely use

the + symbol to concatenate Strings (and useObjects.toString to handle nulls). With the utility classObjects that is built-in the JDK, no need to have externalframeworks to deal with null values. So, out of the box,the JDK has better performance than any other technicdescribed in this article.“ [Antonio Goncalves, Gonc]

Nachtrag: sowieso nur interessant, wenn Sie toString() sehr oftaufrufen

,Bernd Muller 19.4.2016 24/60

Page 42: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Performanz

Performanz: toString()

Who Cares About toString Performance? (cont’d)

Zusammenfassung:

”Today with the JVM optimisation, we can safely use

the + symbol to concatenate Strings (and useObjects.toString to handle nulls). With the utility classObjects that is built-in the JDK, no need to have externalframeworks to deal with null values. So, out of the box,the JDK has better performance than any other technicdescribed in this article.“ [Antonio Goncalves, Gonc]

Nachtrag: sowieso nur interessant, wenn Sie toString() sehr oftaufrufen

,Bernd Muller 19.4.2016 24/60

Page 43: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Performanz

Performanz: String-Konkatenation

Performanz: String-Konkatenation

,Bernd Muller 19.4.2016 25/60

Page 44: Was jeder Java-Entwickler über Strings wissen sollte

JDK String-Konkatenation

@Benchmark

// String +

public static String concat () {

String result = "";

for (int i = 0; i < IT; i++) {

result += i;

}

return result;

}

@Benchmark

// StringBuffer

public static String concat () {

StringBuffer builder = new StringBuffer ();

for (int i = 0; i < IT; i++) {

builder.append(i);

}

return builder.toString ();

}

@Benchmark

// Joining Collector

public static String concat () {

return IntStream.range(0, IT)

.mapToObj(String :: valueOf)

.collect(Collectors.joining ());

}

@Benchmark

// StringBuilder

public static String concat () {

StringBuilder builder = new StringBuilder ();

for (int i = 0; i < IT; i++) {

builder.append(i);

}

return builder.toString ();

}

Page 45: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Performanz

Performanz: String-Konkatenation

JMH Ergebnisse

Benchmark Score Error Units

SC.concatWithJoiningCollector 2898,767 ± 5,378 ops/sSC.concatWithString 25,434 ± 0,059 ops/sSC.concatWithStringBuffer 5375,578 ± 39,959 ops/sSC.concatWithStringBuilder 6030,804 ± 13,088 ops/s

,Bernd Muller 19.4.2016 27/60

Page 46: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Internte Strings

,Bernd Muller 19.4.2016 28/60

Page 47: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Was ist das ?

Internte Strings — Was ist das ?

,Bernd Muller 19.4.2016 29/60

Page 48: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Was ist das ?

Internte Strings

Moreover, a string literal always refers to the same instance ofclass String. This is because string literals - or, more generally,strings that are the values of constant expressions (§15.28) - are”interned” so as to share unique instances, using the methodString.intern. [JLS 3.10.5 String Literals]

I String-Memory-Pool mit allen internten Strings

I Beim Laden einer Klasse in die VM wird gepruft, obString-Literal schon im Pool

I Falls ja, wird es wiederverwendet, falls nein, neu eingetragen

I String-Literale gibt es also nur einmal in einer VM

,Bernd Muller 19.4.2016 30/60

Page 49: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Was ist das ?

Internte Strings

Moreover, a string literal always refers to the same instance ofclass String. This is because string literals - or, more generally,strings that are the values of constant expressions (§15.28) - are”interned” so as to share unique instances, using the methodString.intern. [JLS 3.10.5 String Literals]

I String-Memory-Pool mit allen internten Strings

I Beim Laden einer Klasse in die VM wird gepruft, obString-Literal schon im Pool

I Falls ja, wird es wiederverwendet, falls nein, neu eingetragen

I String-Literale gibt es also nur einmal in einer VM

,Bernd Muller 19.4.2016 30/60

Page 50: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Was ist das ?

Internte Strings

Moreover, a string literal always refers to the same instance ofclass String. This is because string literals - or, more generally,strings that are the values of constant expressions (§15.28) - are”interned” so as to share unique instances, using the methodString.intern. [JLS 3.10.5 String Literals]

I String-Memory-Pool mit allen internten Strings

I Beim Laden einer Klasse in die VM wird gepruft, obString-Literal schon im Pool

I Falls ja, wird es wiederverwendet, falls nein, neu eingetragen

I String-Literale gibt es also nur einmal in einer VM

,Bernd Muller 19.4.2016 30/60

Page 51: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Was ist das ?

Internte Strings

Moreover, a string literal always refers to the same instance ofclass String. This is because string literals - or, more generally,strings that are the values of constant expressions (§15.28) - are”interned” so as to share unique instances, using the methodString.intern. [JLS 3.10.5 String Literals]

I String-Memory-Pool mit allen internten Strings

I Beim Laden einer Klasse in die VM wird gepruft, obString-Literal schon im Pool

I Falls ja, wird es wiederverwendet, falls nein, neu eingetragen

I String-Literale gibt es also nur einmal in einer VM

,Bernd Muller 19.4.2016 30/60

Page 52: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Was ist das ?

Internte Strings

Moreover, a string literal always refers to the same instance ofclass String. This is because string literals - or, more generally,strings that are the values of constant expressions (§15.28) - are”interned” so as to share unique instances, using the methodString.intern. [JLS 3.10.5 String Literals]

I String-Memory-Pool mit allen internten Strings

I Beim Laden einer Klasse in die VM wird gepruft, obString-Literal schon im Pool

I Falls ja, wird es wiederverwendet, falls nein, neu eingetragen

I String-Literale gibt es also nur einmal in einer VM

,Bernd Muller 19.4.2016 30/60

Page 53: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Was ist das ?

Internte String-Literale — Beispiele

String str1 = "Hello , World!";

String str2 = "Hello , World!";

String str3 = new String("Hello , World!"); // sinnlos

Assert.assertSame("Hello , World!", "Hello , World!");

Assert.assertSame(str1 , str2);

Assert.assertSame("Hel" + "lo", "Hel" + "lo");

Assert.assertNotSame(str1 + str1 , str2 + str2);

Assert.assertEquals(str1 + str1 , str2 + str2);

Assert.assertSame ((str1 + str1). intern(),

(str2 + str2). intern ());

Assert.assertNotSame(str1 , str3);

,Bernd Muller 19.4.2016 31/60

Page 54: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Amusantes

Amusantes

,Bernd Muller 19.4.2016 32/60

Page 55: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Amusantes

Spielereien

Was ist die Ausgabe?

System.out.println("Hello , World!");

magic ();

System.out.println("Hello , World!");

private static void magic() throws Exception {

Field field = String.class

.getDeclaredField("value");

field.setAccessible(true);

field.set("Hello , World!",

"tricky intern".toCharArray ());

}

Zuerst gesehen bei Arno Haase

,Bernd Muller 19.4.2016 33/60

Page 56: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Amusantes

Spielereien

Was ist die Ausgabe?

System.out.println("Hello , World!");

magic ();

System.out.println("Hello , World!");

private static void magic() throws Exception {

Field field = String.class

.getDeclaredField("value");

field.setAccessible(true);

field.set("Hello , World!",

"tricky intern".toCharArray ());

}

Zuerst gesehen bei Arno Haase

,Bernd Muller 19.4.2016 33/60

Page 57: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Amusantes

Spielereien

Was ist die Ausgabe?

System.out.println("Hello , World!");

magic ();

System.out.println("Hello , World!");

private static void magic() throws Exception {

Field field = String.class

.getDeclaredField("value");

field.setAccessible(true);

field.set("Hello , World!",

"tricky intern".toCharArray ());

}

Zuerst gesehen bei Arno Haase

Bitte n

ichtnac

hmach

en

,Bernd Muller 19.4.2016 33/60

Page 58: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Amusantes

Spielereien (cont’d)

Was ist die Ausgabe?

System.out.println("Hello , World!");

magic ();

System.out.println("Hello , World!");

public static void magic() throws Exception {

Field field = String.class

.getDeclaredField("value");

field.setAccessible(true);

char[] chars = (char []) field.get("Hello World");

System.arraycopy("tricky intern".toCharArray (),

0, chars , 0, chars.length );

}

,Bernd Muller 19.4.2016 34/60

Page 59: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Amusantes

Spielereien (cont’d)

Was ist die Ausgabe?

System.out.println("Hello , World!");

magic ();

System.out.println("Hello , World!");

public static void magic() throws Exception {

Field field = String.class

.getDeclaredField("value");

field.setAccessible(true);

char[] chars = (char []) field.get("Hello World");

System.arraycopy("tricky intern".toCharArray (),

0, chars , 0, chars.length );

}

Ebenfa

lls nicht

nachm

achen

,Bernd Muller 19.4.2016 34/60

Page 60: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Nochmal Performanz

Nochmal Performanz

,Bernd Muller 19.4.2016 35/60

Page 61: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Nochmal Performanz

Java-Doc String.intern()

Returns a canonical representation for the string object.A pool of strings, initially empty, is maintained privately by the classString.When the intern method is invoked, if the pool already contains a stringequal to this String object as determined by the equals(Object) method,then the string from the pool is returned. Otherwise, this String object isadded to the pool and a reference to this String object is returned.It follows that for any two strings s and t, s.intern() == t.intern() is trueif and only if s.equals(t) is true.All literal strings and string-valued constant expressions are interned.String literals are defined in section 3.10.5 of the The JavaTM LanguageSpecification.Returns: a string that has the same contents as this string, but isguaranteed to be from a pool of unique strings.

,Bernd Muller 19.4.2016 36/60

Page 62: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Nochmal Performanz

Java-Doc String.intern()

Returns a canonical representation for the string object.A pool of strings, initially empty, is maintained privately by the classString.When the intern method is invoked, if the pool already contains a stringequal to this String object as determined by the equals(Object) method,then the string from the pool is returned. Otherwise, this String object isadded to the pool and a reference to this String object is returned.It follows that for any two strings s and t, s.intern() == t.intern() is trueif and only if s.equals(t) is true.All literal strings and string-valued constant expressions are interned.String literals are defined in section 3.10.5 of the The JavaTM LanguageSpecification.Returns: a string that has the same contents as this string, but isguaranteed to be from a pool of unique strings.

,Bernd Muller 19.4.2016 36/60

Page 63: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Nochmal Performanz

Java-Doc String.intern()

Returns a canonical representation for the string object.A pool of strings, initially empty, is maintained privately by the classString.When the intern method is invoked, if the pool already contains a stringequal to this String object as determined by the equals(Object) method,then the string from the pool is returned. Otherwise, this String object isadded to the pool and a reference to this String object is returned.It follows that for any two strings s and t, s.intern() == t.intern() is trueif and only if s.equals(t) is true.All literal strings and string-valued constant expressions are interned.String literals are defined in section 3.10.5 of the The JavaTM LanguageSpecification.Returns: a string that has the same contents as this string, but isguaranteed to be from a pool of unique strings.

,Bernd Muller 19.4.2016 36/60

Page 64: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Nochmal Performanz

Java-Doc String.intern()

Returns a canonical representation for the string object.A pool of strings, initially empty, is maintained privately by the classString.When the intern method is invoked, if the pool already contains a stringequal to this String object as determined by the equals(Object) method,then the string from the pool is returned. Otherwise, this String object isadded to the pool and a reference to this String object is returned.It follows that for any two strings s and t, s.intern() == t.intern() is trueif and only if s.equals(t) is true.All literal strings and string-valued constant expressions are interned.String literals are defined in section 3.10.5 of the The JavaTM LanguageSpecification.Returns: a string that has the same contents as this string, but isguaranteed to be from a pool of unique strings.

,Bernd Muller 19.4.2016 36/60

Page 65: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Nochmal Performanz

Java-Doc String.intern()

Returns a canonical representation for the string object.A pool of strings, initially empty, is maintained privately by the classString.When the intern method is invoked, if the pool already contains a stringequal to this String object as determined by the equals(Object) method,then the string from the pool is returned. Otherwise, this String object isadded to the pool and a reference to this String object is returned.It follows that for any two strings s and t, s.intern() == t.intern() is trueif and only if s.equals(t) is true.All literal strings and string-valued constant expressions are interned.String literals are defined in section 3.10.5 of the The JavaTM LanguageSpecification.Returns: a string that has the same contents as this string, but isguaranteed to be from a pool of unique strings.

,Bernd Muller 19.4.2016 36/60

Page 66: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Nochmal Performanz

Performanz-Idee: String-Interning und Equals

”On the topic of interning strings, what about using the intern()

method to make the programm run faster, since interned stringscan be compared via the == operator? That is a popular thought,though in most cases it turns out to by a myth. TheString.equals() method is pretty fast.. . .Comparing strings via the == operator is undeniably faster, but thecost of interning the string must also be taken into consideration.“[Java Performance, Scott Oaks]

,Bernd Muller 19.4.2016 37/60

Page 67: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Nochmal Performanz

Performanz-Idee: String-Interning und Equals

”On the topic of interning strings, what about using the intern()

method to make the programm run faster, since interned stringscan be compared via the == operator? That is a popular thought,though in most cases it turns out to by a myth. TheString.equals() method is pretty fast.. . .Comparing strings via the == operator is undeniably faster, but thecost of interning the string must also be taken into consideration.“[Java Performance, Scott Oaks]

,Bernd Muller 19.4.2016 37/60

Page 68: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Nochmal Performanz

Performanz-Idee: String-Interning und Equals

”On the topic of interning strings, what about using the intern()

method to make the programm run faster, since interned stringscan be compared via the == operator? That is a popular thought,though in most cases it turns out to by a myth. TheString.equals() method is pretty fast.. . .Comparing strings via the == operator is undeniably faster, but thecost of interning the string must also be taken into consideration.“[Java Performance, Scott Oaks]

,Bernd Muller 19.4.2016 37/60

Page 69: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Nochmal Performanz

Performanz-Idee: String-Interning und Equals

”On the topic of interning strings, what about using the intern()

method to make the programm run faster, since interned stringscan be compared via the == operator? That is a popular thought,though in most cases it turns out to by a myth. TheString.equals() method is pretty fast.. . .Comparing strings via the == operator is undeniably faster, but thecost of interning the string must also be taken into consideration.“[Java Performance, Scott Oaks]

,Bernd Muller 19.4.2016 37/60

Page 70: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Nochmal Performanz

Java Performance, Scott Oaks

”Like most optimizations, interning strings shouldn’t

be done arbitrarily, but it can be effective if there are lotsof duplicate strings occupying a significant portion of theheap.“

,Bernd Muller 19.4.2016 38/60

Page 71: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Und nochmal Performanz

Und nochmal Performanz

,Bernd Muller 19.4.2016 39/60

Page 72: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Und nochmal Performanz

Auch bitte nicht selbst versuchen: MyString

”In compiler theory, an intrinsic function is a function available for

use in a given programming language whose implementation ishandled specially by the compiler. Typically, it substitutes asequence of automatically generated instructions for the originalfunction call, similar to an inline function. Unlike an inline functionthough, the compiler has an intimate knowledge of the intrinsicfunction and can therefore better integrate it and optimize it forthe situation.“[Wikipedia,Intr1]

I In Java Compiler, JIT, evtl. sogar in JVM eingebautI String.equals() ist intrinsic. String.indexOf(),

String.compareTo() ebenfalls [Krystal Mo,Intr2]I String.intern() ist sogar nativ implementiert

,Bernd Muller 19.4.2016 40/60

Page 73: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Und nochmal Performanz

Auch bitte nicht selbst versuchen: MyString

”In compiler theory, an intrinsic function is a function available for

use in a given programming language whose implementation ishandled specially by the compiler. Typically, it substitutes asequence of automatically generated instructions for the originalfunction call, similar to an inline function. Unlike an inline functionthough, the compiler has an intimate knowledge of the intrinsicfunction and can therefore better integrate it and optimize it forthe situation.“[Wikipedia,Intr1]

I In Java Compiler, JIT, evtl. sogar in JVM eingebautI String.equals() ist intrinsic. String.indexOf(),

String.compareTo() ebenfalls [Krystal Mo,Intr2]I String.intern() ist sogar nativ implementiert

,Bernd Muller 19.4.2016 40/60

Page 74: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Und nochmal Performanz

Auch bitte nicht selbst versuchen: MyString

”In compiler theory, an intrinsic function is a function available for

use in a given programming language whose implementation ishandled specially by the compiler. Typically, it substitutes asequence of automatically generated instructions for the originalfunction call, similar to an inline function. Unlike an inline functionthough, the compiler has an intimate knowledge of the intrinsicfunction and can therefore better integrate it and optimize it forthe situation.“[Wikipedia,Intr1]

I In Java Compiler, JIT, evtl. sogar in JVM eingebautI String.equals() ist intrinsic. String.indexOf(),

String.compareTo() ebenfalls [Krystal Mo,Intr2]I String.intern() ist sogar nativ implementiert

,Bernd Muller 19.4.2016 40/60

Page 75: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Und nochmal Performanz

Auch bitte nicht selbst versuchen: MyString

”In compiler theory, an intrinsic function is a function available for

use in a given programming language whose implementation ishandled specially by the compiler. Typically, it substitutes asequence of automatically generated instructions for the originalfunction call, similar to an inline function. Unlike an inline functionthough, the compiler has an intimate knowledge of the intrinsicfunction and can therefore better integrate it and optimize it forthe situation.“[Wikipedia,Intr1]

I In Java Compiler, JIT, evtl. sogar in JVM eingebaut

I String.equals() ist intrinsic. String.indexOf(),String.compareTo() ebenfalls [Krystal Mo,Intr2]

I String.intern() ist sogar nativ implementiert

,Bernd Muller 19.4.2016 40/60

Page 76: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Und nochmal Performanz

Auch bitte nicht selbst versuchen: MyString

”In compiler theory, an intrinsic function is a function available for

use in a given programming language whose implementation ishandled specially by the compiler. Typically, it substitutes asequence of automatically generated instructions for the originalfunction call, similar to an inline function. Unlike an inline functionthough, the compiler has an intimate knowledge of the intrinsicfunction and can therefore better integrate it and optimize it forthe situation.“[Wikipedia,Intr1]

I In Java Compiler, JIT, evtl. sogar in JVM eingebautI String.equals() ist intrinsic. String.indexOf(),

String.compareTo() ebenfalls [Krystal Mo,Intr2]I String.intern() ist sogar nativ implementiert

,Bernd Muller 19.4.2016 40/60

Page 77: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Implementierung

Implementierung

,Bernd Muller 19.4.2016 41/60

Page 78: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Implementierung

Der String-Pool

I Implementiert als Hashtable fester Große

I Bucket-Große ab Java 6 einstellbarI Nativ in JVM realisiert, Große nicht veranderbarI In Java 6 in Permanent Generation, 7 und hoher im Heap

I Daher in Java 6 OOME: PermGen spaceI Java 7 und hoher OOME: Java heap space

I Großen:

I Vor Java 7u40 1009 BucketsI Java 7u40 und spater 60013I VM-Schalter:

I -XX:StringTableSize=<value>I -XX:+PrintStringTableStatistics (Java 7u6 und großer,

6u32 Backport)

,Bernd Muller 19.4.2016 42/60

Page 79: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Implementierung

Der String-Pool

I Implementiert als Hashtable fester GroßeI Bucket-Große ab Java 6 einstellbar

I Nativ in JVM realisiert, Große nicht veranderbarI In Java 6 in Permanent Generation, 7 und hoher im Heap

I Daher in Java 6 OOME: PermGen spaceI Java 7 und hoher OOME: Java heap space

I Großen:

I Vor Java 7u40 1009 BucketsI Java 7u40 und spater 60013I VM-Schalter:

I -XX:StringTableSize=<value>I -XX:+PrintStringTableStatistics (Java 7u6 und großer,

6u32 Backport)

,Bernd Muller 19.4.2016 42/60

Page 80: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Implementierung

Der String-Pool

I Implementiert als Hashtable fester GroßeI Bucket-Große ab Java 6 einstellbarI Nativ in JVM realisiert, Große nicht veranderbar

I In Java 6 in Permanent Generation, 7 und hoher im Heap

I Daher in Java 6 OOME: PermGen spaceI Java 7 und hoher OOME: Java heap space

I Großen:

I Vor Java 7u40 1009 BucketsI Java 7u40 und spater 60013I VM-Schalter:

I -XX:StringTableSize=<value>I -XX:+PrintStringTableStatistics (Java 7u6 und großer,

6u32 Backport)

,Bernd Muller 19.4.2016 42/60

Page 81: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Implementierung

Der String-Pool

I Implementiert als Hashtable fester GroßeI Bucket-Große ab Java 6 einstellbarI Nativ in JVM realisiert, Große nicht veranderbarI In Java 6 in Permanent Generation, 7 und hoher im Heap

I Daher in Java 6 OOME: PermGen spaceI Java 7 und hoher OOME: Java heap space

I Großen:

I Vor Java 7u40 1009 BucketsI Java 7u40 und spater 60013I VM-Schalter:

I -XX:StringTableSize=<value>I -XX:+PrintStringTableStatistics (Java 7u6 und großer,

6u32 Backport)

,Bernd Muller 19.4.2016 42/60

Page 82: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Implementierung

Der String-Pool

I Implementiert als Hashtable fester GroßeI Bucket-Große ab Java 6 einstellbarI Nativ in JVM realisiert, Große nicht veranderbarI In Java 6 in Permanent Generation, 7 und hoher im Heap

I Daher in Java 6 OOME: PermGen space

I Java 7 und hoher OOME: Java heap spaceI Großen:

I Vor Java 7u40 1009 BucketsI Java 7u40 und spater 60013I VM-Schalter:

I -XX:StringTableSize=<value>I -XX:+PrintStringTableStatistics (Java 7u6 und großer,

6u32 Backport)

,Bernd Muller 19.4.2016 42/60

Page 83: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Implementierung

Der String-Pool

I Implementiert als Hashtable fester GroßeI Bucket-Große ab Java 6 einstellbarI Nativ in JVM realisiert, Große nicht veranderbarI In Java 6 in Permanent Generation, 7 und hoher im Heap

I Daher in Java 6 OOME: PermGen spaceI Java 7 und hoher OOME: Java heap space

I Großen:

I Vor Java 7u40 1009 BucketsI Java 7u40 und spater 60013I VM-Schalter:

I -XX:StringTableSize=<value>I -XX:+PrintStringTableStatistics (Java 7u6 und großer,

6u32 Backport)

,Bernd Muller 19.4.2016 42/60

Page 84: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Implementierung

Der String-Pool

I Implementiert als Hashtable fester GroßeI Bucket-Große ab Java 6 einstellbarI Nativ in JVM realisiert, Große nicht veranderbarI In Java 6 in Permanent Generation, 7 und hoher im Heap

I Daher in Java 6 OOME: PermGen spaceI Java 7 und hoher OOME: Java heap space

I Großen:

I Vor Java 7u40 1009 BucketsI Java 7u40 und spater 60013I VM-Schalter:

I -XX:StringTableSize=<value>I -XX:+PrintStringTableStatistics (Java 7u6 und großer,

6u32 Backport)

,Bernd Muller 19.4.2016 42/60

Page 85: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Implementierung

Der String-Pool

I Implementiert als Hashtable fester GroßeI Bucket-Große ab Java 6 einstellbarI Nativ in JVM realisiert, Große nicht veranderbarI In Java 6 in Permanent Generation, 7 und hoher im Heap

I Daher in Java 6 OOME: PermGen spaceI Java 7 und hoher OOME: Java heap space

I Großen:I Vor Java 7u40 1009 Buckets

I Java 7u40 und spater 60013I VM-Schalter:

I -XX:StringTableSize=<value>I -XX:+PrintStringTableStatistics (Java 7u6 und großer,

6u32 Backport)

,Bernd Muller 19.4.2016 42/60

Page 86: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Implementierung

Der String-Pool

I Implementiert als Hashtable fester GroßeI Bucket-Große ab Java 6 einstellbarI Nativ in JVM realisiert, Große nicht veranderbarI In Java 6 in Permanent Generation, 7 und hoher im Heap

I Daher in Java 6 OOME: PermGen spaceI Java 7 und hoher OOME: Java heap space

I Großen:I Vor Java 7u40 1009 BucketsI Java 7u40 und spater 60013

I VM-Schalter:

I -XX:StringTableSize=<value>I -XX:+PrintStringTableStatistics (Java 7u6 und großer,

6u32 Backport)

,Bernd Muller 19.4.2016 42/60

Page 87: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Implementierung

Der String-Pool

I Implementiert als Hashtable fester GroßeI Bucket-Große ab Java 6 einstellbarI Nativ in JVM realisiert, Große nicht veranderbarI In Java 6 in Permanent Generation, 7 und hoher im Heap

I Daher in Java 6 OOME: PermGen spaceI Java 7 und hoher OOME: Java heap space

I Großen:I Vor Java 7u40 1009 BucketsI Java 7u40 und spater 60013I VM-Schalter:

I -XX:StringTableSize=<value>I -XX:+PrintStringTableStatistics (Java 7u6 und großer,

6u32 Backport)

,Bernd Muller 19.4.2016 42/60

Page 88: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Implementierung

Der String-Pool

I Implementiert als Hashtable fester GroßeI Bucket-Große ab Java 6 einstellbarI Nativ in JVM realisiert, Große nicht veranderbarI In Java 6 in Permanent Generation, 7 und hoher im Heap

I Daher in Java 6 OOME: PermGen spaceI Java 7 und hoher OOME: Java heap space

I Großen:I Vor Java 7u40 1009 BucketsI Java 7u40 und spater 60013I VM-Schalter:

I -XX:StringTableSize=<value>

I -XX:+PrintStringTableStatistics (Java 7u6 und großer,6u32 Backport)

,Bernd Muller 19.4.2016 42/60

Page 89: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Internte Strings

Implementierung

Der String-Pool

I Implementiert als Hashtable fester GroßeI Bucket-Große ab Java 6 einstellbarI Nativ in JVM realisiert, Große nicht veranderbarI In Java 6 in Permanent Generation, 7 und hoher im Heap

I Daher in Java 6 OOME: PermGen spaceI Java 7 und hoher OOME: Java heap space

I Großen:I Vor Java 7u40 1009 BucketsI Java 7u40 und spater 60013I VM-Schalter:

I -XX:StringTableSize=<value>I -XX:+PrintStringTableStatistics (Java 7u6 und großer,

6u32 Backport)

,Bernd Muller 19.4.2016 42/60

Page 90: Was jeder Java-Entwickler über Strings wissen sollte

Beispiele -XX:+PrintStringTableStatistics

StringTable statistics:

Number of buckets : 1003

Average bucket size : 33

Variance of bucket size : 33

Std. dev. of bucket size: 6

Maximum bucket size : 51

StringTable statistics:

Number of buckets : 60013

Average bucket size : 1

Variance of bucket size : 1

Std. dev. of bucket size: 1

Maximum bucket size : 10

StringTable statistics:

Number of buckets : 60013

Average bucket size : 0

Variance of bucket size : 0

Std. dev. of bucket size: 1

Maximum bucket size : 5

Page 91: Was jeder Java-Entwickler über Strings wissen sollte

Beispiele -XX:+PrintStringTableStatistics

StringTable statistics:

Number of buckets : 1003

Average bucket size : 33

Variance of bucket size : 33

Std. dev. of bucket size: 6

Maximum bucket size : 51

StringTable statistics:

Number of buckets : 60013

Average bucket size : 1

Variance of bucket size : 1

Std. dev. of bucket size: 1

Maximum bucket size : 10

StringTable statistics:

Number of buckets : 60013

Average bucket size : 0

Variance of bucket size : 0

Std. dev. of bucket size: 1

Maximum bucket size : 5

Page 92: Was jeder Java-Entwickler über Strings wissen sollte

Beispiele -XX:+PrintStringTableStatistics

StringTable statistics:

Number of buckets : 1003

Average bucket size : 33

Variance of bucket size : 33

Std. dev. of bucket size: 6

Maximum bucket size : 51Sch

lecht

StringTable statistics:

Number of buckets : 60013

Average bucket size : 1

Variance of bucket size : 1

Std. dev. of bucket size: 1

Maximum bucket size : 10

StringTable statistics:

Number of buckets : 60013

Average bucket size : 0

Variance of bucket size : 0

Std. dev. of bucket size: 1

Maximum bucket size : 5

Page 93: Was jeder Java-Entwickler über Strings wissen sollte

Beispiele -XX:+PrintStringTableStatistics

StringTable statistics:

Number of buckets : 1003

Average bucket size : 33

Variance of bucket size : 33

Std. dev. of bucket size: 6

Maximum bucket size : 51Sch

lecht

StringTable statistics:

Number of buckets : 60013

Average bucket size : 1

Variance of bucket size : 1

Std. dev. of bucket size: 1

Maximum bucket size : 10

StringTable statistics:

Number of buckets : 60013

Average bucket size : 0

Variance of bucket size : 0

Std. dev. of bucket size: 1

Maximum bucket size : 5

Page 94: Was jeder Java-Entwickler über Strings wissen sollte

Beispiele -XX:+PrintStringTableStatistics

StringTable statistics:

Number of buckets : 1003

Average bucket size : 33

Variance of bucket size : 33

Std. dev. of bucket size: 6

Maximum bucket size : 51Sch

lecht

StringTable statistics:

Number of buckets : 60013

Average bucket size : 1

Variance of bucket size : 1

Std. dev. of bucket size: 1

Maximum bucket size : 10Vielbess

er

StringTable statistics:

Number of buckets : 60013

Average bucket size : 0

Variance of bucket size : 0

Std. dev. of bucket size: 1

Maximum bucket size : 5

Page 95: Was jeder Java-Entwickler über Strings wissen sollte

Beispiele -XX:+PrintStringTableStatistics

StringTable statistics:

Number of buckets : 1003

Average bucket size : 33

Variance of bucket size : 33

Std. dev. of bucket size: 6

Maximum bucket size : 51Sch

lecht

StringTable statistics:

Number of buckets : 60013

Average bucket size : 1

Variance of bucket size : 1

Std. dev. of bucket size: 1

Maximum bucket size : 10Vielbess

er

StringTable statistics:

Number of buckets : 60013

Average bucket size : 0

Variance of bucket size : 0

Std. dev. of bucket size: 1

Maximum bucket size : 5

Page 96: Was jeder Java-Entwickler über Strings wissen sollte

Beispiele -XX:+PrintStringTableStatistics

StringTable statistics:

Number of buckets : 1003

Average bucket size : 33

Variance of bucket size : 33

Std. dev. of bucket size: 6

Maximum bucket size : 51Sch

lecht

StringTable statistics:

Number of buckets : 60013

Average bucket size : 1

Variance of bucket size : 1

Std. dev. of bucket size: 1

Maximum bucket size : 10Vielbess

er

StringTable statistics:

Number of buckets : 60013

Average bucket size : 0

Variance of bucket size : 0

Std. dev. of bucket size: 1

Maximum bucket size : 5Empfehle

nswert

Page 97: Was jeder Java-Entwickler über Strings wissen sollte

In Java 8 ausfuhrlichere Informationen

StringTable statistics:

Number of buckets : 60013 = 480104 bytes , avg 8,000

Number of entries : 797 = 19128 bytes , avg 24 ,000

Number of literals : 797 = 151960 bytes , avg 190 ,665

Total footprint : = 651192 bytes

Average bucket size : 0,013

Variance of bucket size : 0,013

Std. dev. of bucket size: 0,115

Maximum bucket size : 2

Page 98: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

GC1 String-Deduplication

GC1 + JVM-Optionen

,Bernd Muller 19.4.2016 45/60

Page 99: Was jeder Java-Entwickler über Strings wissen sollte

JEP 192: String Deduplication in G1 [JEP192]Summary

”Reduce the Java heap live-data set by enhancing the G1 garbage

collector so that duplicate instances of String are automaticallyand continuously deduplicated. “

Motivation

”. . . Measurements have shown that roughly 25% of the Java heap

live data set in these types of applications is consumed by Stringobjects. . . . roughly half of those String objects are duplicates. . . Having duplicate String objects on the heap is, essentially, justa waste of memory“Description

”The value field is implementation-specific and not observable

from outside . . . This means that it can safely and transparently beused by multiple instances of String at the same time.Deduplicating a String object is conceptually just an re-assignmentof the value field, i.e., aString.value = anotherString.value.

Page 100: Was jeder Java-Entwickler über Strings wissen sollte

JEP 192: String Deduplication in G1 [JEP192]Summary

”Reduce the Java heap live-data set by enhancing the G1 garbage

collector so that duplicate instances of String are automaticallyand continuously deduplicated. “Motivation

”. . . Measurements have shown that roughly 25% of the Java heap

live data set in these types of applications is consumed by Stringobjects. . . . roughly half of those String objects are duplicates. . . Having duplicate String objects on the heap is, essentially, justa waste of memory“

Description

”The value field is implementation-specific and not observable

from outside . . . This means that it can safely and transparently beused by multiple instances of String at the same time.Deduplicating a String object is conceptually just an re-assignmentof the value field, i.e., aString.value = anotherString.value.

Page 101: Was jeder Java-Entwickler über Strings wissen sollte

JEP 192: String Deduplication in G1 [JEP192]Summary

”Reduce the Java heap live-data set by enhancing the G1 garbage

collector so that duplicate instances of String are automaticallyand continuously deduplicated. “Motivation

”. . . Measurements have shown that roughly 25% of the Java heap

live data set in these types of applications is consumed by Stringobjects. . . . roughly half of those String objects are duplicates. . . Having duplicate String objects on the heap is, essentially, justa waste of memory“Description

”The value field is implementation-specific and not observable

from outside . . . This means that it can safely and transparently beused by multiple instances of String at the same time.

Deduplicating a String object is conceptually just an re-assignmentof the value field, i.e., aString.value = anotherString.value.

Page 102: Was jeder Java-Entwickler über Strings wissen sollte

JEP 192: String Deduplication in G1 [JEP192]Summary

”Reduce the Java heap live-data set by enhancing the G1 garbage

collector so that duplicate instances of String are automaticallyand continuously deduplicated. “Motivation

”. . . Measurements have shown that roughly 25% of the Java heap

live data set in these types of applications is consumed by Stringobjects. . . . roughly half of those String objects are duplicates. . . Having duplicate String objects on the heap is, essentially, justa waste of memory“Description

”The value field is implementation-specific and not observable

from outside . . . This means that it can safely and transparently beused by multiple instances of String at the same time.Deduplicating a String object is conceptually just an re-assignmentof the value field, i.e., aString.value = anotherString.value.

Page 103: Was jeder Java-Entwickler über Strings wissen sollte

-XX:+UseG1GC -XX:+UseStringDeduplication

String tmp = "some string";

String string1 = new String(tmp + tmp);

String string2 = new String(tmp + tmp);

Field field = String.class.getDeclaredField("value");

field.setAccessible(true);

Assert.assertEquals(string1 , string2 );

Assert.assertNotSame(string1 , string2 );

Assert.assertNotSame(field.get(string1),

field.get(string2 ));

System.gc();

Thread.sleep (1000);

Assert.assertNotSame(string1 , string2 );

Assert.assertSame(field.get(string1),

field.get(string2 ));

Page 104: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

GC1 String-Deduplication

Erfahrungsbericht

I Artikel G1: from garbage collector to waste managementconsultant

I von Erik Costlow, 24.3.2016, Java Platform Group, ProductManagement blog

I Aussage: String Deduplication may decrease heap usage byabout 10%

I Am Beispiel Eclipse

I Referenz: [DEDUP]

,Bernd Muller 19.4.2016 48/60

Page 105: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

Dies und das

,Bernd Muller 19.4.2016 49/60

Page 106: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

Heinz Kabutz, Reflection Madness, JAX London 2014

I Java 1.0 - 1.2I String contained char[], offset, count

I Java 1.3 - 1.6I Added a cached hash codeI String became a shared, mutable, but thread-safe class

I Java 1.7I Got rid of offset and length and added hash32

I Java 1.8I Got rid of hash32 again

,Bernd Muller 19.4.2016 50/60

Page 107: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

Andere String-relevante VM-Optionen

I -XX:+UseStringCache

”Enables caching of commonly allocated strings.“

Keine weiteren Informationen gefunden. Vorhanden in Java 6und 7. Entfernt in Java 8

I -XX:+UseCompressedStrings

”Use a byte[] for Strings which can be represented as pure

ASCII.“Eingefuhrt in Java 6u21. Wieder entfernt in Java 7

I -XX:+OptimizeStringConcat

”Optimize String concatenation operations where possible.“

Eingefuhrt in Java 6u20. Optimiert wiederholte StringBuilderappend()-Aufrufe

,Bernd Muller 19.4.2016 51/60

Page 108: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

Andere String-relevante VM-Optionen

I -XX:+UseStringCache

”Enables caching of commonly allocated strings.“

Keine weiteren Informationen gefunden. Vorhanden in Java 6und 7. Entfernt in Java 8

I -XX:+UseCompressedStrings

”Use a byte[] for Strings which can be represented as pure

ASCII.“Eingefuhrt in Java 6u21. Wieder entfernt in Java 7

I -XX:+OptimizeStringConcat

”Optimize String concatenation operations where possible.“

Eingefuhrt in Java 6u20. Optimiert wiederholte StringBuilderappend()-Aufrufe

,Bernd Muller 19.4.2016 51/60

Page 109: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

Andere String-relevante VM-Optionen

I -XX:+UseStringCache

”Enables caching of commonly allocated strings.“

Keine weiteren Informationen gefunden. Vorhanden in Java 6und 7. Entfernt in Java 8

I -XX:+UseCompressedStrings

”Use a byte[] for Strings which can be represented as pure

ASCII.“Eingefuhrt in Java 6u21. Wieder entfernt in Java 7

I -XX:+OptimizeStringConcat

”Optimize String concatenation operations where possible.“

Eingefuhrt in Java 6u20. Optimiert wiederholte StringBuilderappend()-Aufrufe

,Bernd Muller 19.4.2016 51/60

Page 110: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

Ausblick — es geht immer weiter . . .

I JEP 254: Compact Strings [JEP254]

I Bereits 8/2014 definiert

I”Wiederbelebung“ von -XX:+UseCompressedStrings

I kodiert Zeichen als ISO-8859-1/Latin-1 (1 Byte pro Zeichen)oder UTF-16 (2 Bytes pro Zeichen)

I Marker zur Kennzeichnung

I JavaOne 2015, CON5483: Compact Strings: AMemory-Efficient Internal Representation for Strings

I Gemeinsames Projekt von Oracle und Intel, 10+ Entwickler

I Kommt in Java 9. In neueren EAs enthalten

,Bernd Muller 19.4.2016 52/60

Page 111: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

Ausblick — es geht immer weiter . . .

I JEP 254: Compact Strings [JEP254]

I Bereits 8/2014 definiert

I”Wiederbelebung“ von -XX:+UseCompressedStrings

I kodiert Zeichen als ISO-8859-1/Latin-1 (1 Byte pro Zeichen)oder UTF-16 (2 Bytes pro Zeichen)

I Marker zur Kennzeichnung

I JavaOne 2015, CON5483: Compact Strings: AMemory-Efficient Internal Representation for Strings

I Gemeinsames Projekt von Oracle und Intel, 10+ Entwickler

I Kommt in Java 9. In neueren EAs enthalten

,Bernd Muller 19.4.2016 52/60

Page 112: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

Ausblick — es geht immer weiter . . .

I JEP 254: Compact Strings [JEP254]

I Bereits 8/2014 definiert

I”Wiederbelebung“ von -XX:+UseCompressedStrings

I kodiert Zeichen als ISO-8859-1/Latin-1 (1 Byte pro Zeichen)oder UTF-16 (2 Bytes pro Zeichen)

I Marker zur Kennzeichnung

I JavaOne 2015, CON5483: Compact Strings: AMemory-Efficient Internal Representation for Strings

I Gemeinsames Projekt von Oracle und Intel, 10+ Entwickler

I Kommt in Java 9. In neueren EAs enthalten

,Bernd Muller 19.4.2016 52/60

Page 113: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

Ausblick — es geht immer weiter . . .

I JEP 254: Compact Strings [JEP254]

I Bereits 8/2014 definiert

I”Wiederbelebung“ von -XX:+UseCompressedStrings

I kodiert Zeichen als ISO-8859-1/Latin-1 (1 Byte pro Zeichen)oder UTF-16 (2 Bytes pro Zeichen)

I Marker zur Kennzeichnung

I JavaOne 2015, CON5483: Compact Strings: AMemory-Efficient Internal Representation for Strings

I Gemeinsames Projekt von Oracle und Intel, 10+ Entwickler

I Kommt in Java 9. In neueren EAs enthalten

,Bernd Muller 19.4.2016 52/60

Page 114: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

Ausblick — es geht immer weiter . . .

I JEP 254: Compact Strings [JEP254]

I Bereits 8/2014 definiert

I”Wiederbelebung“ von -XX:+UseCompressedStrings

I kodiert Zeichen als ISO-8859-1/Latin-1 (1 Byte pro Zeichen)oder UTF-16 (2 Bytes pro Zeichen)

I Marker zur Kennzeichnung

I JavaOne 2015, CON5483: Compact Strings: AMemory-Efficient Internal Representation for Strings

I Gemeinsames Projekt von Oracle und Intel, 10+ Entwickler

I Kommt in Java 9. In neueren EAs enthalten

,Bernd Muller 19.4.2016 52/60

Page 115: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

Ausblick — es geht immer weiter . . .

I JEP 254: Compact Strings [JEP254]

I Bereits 8/2014 definiert

I”Wiederbelebung“ von -XX:+UseCompressedStrings

I kodiert Zeichen als ISO-8859-1/Latin-1 (1 Byte pro Zeichen)oder UTF-16 (2 Bytes pro Zeichen)

I Marker zur Kennzeichnung

I JavaOne 2015, CON5483: Compact Strings: AMemory-Efficient Internal Representation for Strings

I Gemeinsames Projekt von Oracle und Intel, 10+ Entwickler

I Kommt in Java 9. In neueren EAs enthalten

,Bernd Muller 19.4.2016 52/60

Page 116: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

Ausblick — es geht immer weiter . . .

I JEP 254: Compact Strings [JEP254]

I Bereits 8/2014 definiert

I”Wiederbelebung“ von -XX:+UseCompressedStrings

I kodiert Zeichen als ISO-8859-1/Latin-1 (1 Byte pro Zeichen)oder UTF-16 (2 Bytes pro Zeichen)

I Marker zur Kennzeichnung

I JavaOne 2015, CON5483: Compact Strings: AMemory-Efficient Internal Representation for Strings

I Gemeinsames Projekt von Oracle und Intel, 10+ Entwickler

I Kommt in Java 9. In neueren EAs enthalten

,Bernd Muller 19.4.2016 52/60

Page 117: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

Ausblick — es geht immer weiter . . .

I JEP 254: Compact Strings [JEP254]

I Bereits 8/2014 definiert

I”Wiederbelebung“ von -XX:+UseCompressedStrings

I kodiert Zeichen als ISO-8859-1/Latin-1 (1 Byte pro Zeichen)oder UTF-16 (2 Bytes pro Zeichen)

I Marker zur Kennzeichnung

I JavaOne 2015, CON5483: Compact Strings: AMemory-Efficient Internal Representation for Strings

I Gemeinsames Projekt von Oracle und Intel, 10+ Entwickler

I Kommt in Java 9. In neueren EAs enthalten

,Bernd Muller 19.4.2016 52/60

Page 118: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

Wer an Schnittstellen vorbei programmiert,ist selbst schuld . . .

I Große Diskussion: sun.misc.Unsafe

I Hier: magic(), in Abschnitt Amusantes

I . . . schauen wir uns die Details an . . .

,Bernd Muller 19.4.2016 53/60

Page 119: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

Wer an Schnittstellen vorbei programmiert,ist selbst schuld . . .

I Große Diskussion: sun.misc.Unsafe

I Hier: magic(), in Abschnitt Amusantes

I . . . schauen wir uns die Details an . . .

,Bernd Muller 19.4.2016 53/60

Page 120: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

Wer an Schnittstellen vorbei programmiert,ist selbst schuld . . .

I Große Diskussion: sun.misc.Unsafe

I Hier: magic(), in Abschnitt Amusantes

I . . . schauen wir uns die Details an . . .

,Bernd Muller 19.4.2016 53/60

Page 121: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

String-Interna vor JEP 254

/** The value is used for character storage. */

private final char value [];

,Bernd Muller 19.4.2016 54/60

Page 122: Was jeder Java-Entwickler über Strings wissen sollte

String-Interna nach JEP 254

/**

* The value is used for character storage.

*

* @implNote This field is trusted by the VM , and is a subject to

* constant folding if String instance is constant. Overwriting this

* field after construction will cause problems.

*

* Additionally , it is marked with {@link Stable} to trust the contents

* of the array. No other facility in JDK provides this functionality (yet ).

* {@link Stable} is safe here , because value is never null.

*/

@Stable

private final byte[] value;

/**

* The identifier of the encoding used to encode the bytes in

* {@code value }. The supported values in this implementation are

*

* LATIN1

* UTF16

*

* @implNote This field is trusted by the VM , and is a subject to

* constant folding if String instance is constant. Overwriting this

* field after construction will cause problems.

*/

private final byte coder;

Page 123: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

magic() uberarbeitet

Wirft mit Java 9 Exception:java.lang.IllegalArgumentException: Can not set

final [B field java.lang.String.value to [C

Uberarbeitung: ausprivate static void magic() throws Exception {

Field field = String.class.getDeclaredField("value");

field.setAccessible(true);

field.set("Hello , World!", "tricky intern".toCharArray ());

}

wirdprivate static void magic() throws Exception {

Field field = String.class.getDeclaredField("value");

field.setAccessible(true);

field.set("Hello , World!", "tricky intern".getBytes ());

}

,Bernd Muller 19.4.2016 56/60

Page 124: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Dies und das

magic() uberarbeitet

Wirft mit Java 9 Exception:java.lang.IllegalArgumentException: Can not set

final [B field java.lang.String.value to [C

Uberarbeitung: ausprivate static void magic() throws Exception {

Field field = String.class.getDeclaredField("value");

field.setAccessible(true);

field.set("Hello , World!", "tricky intern".toCharArray ());

}

wirdprivate static void magic() throws Exception {

Field field = String.class.getDeclaredField("value");

field.setAccessible(true);

field.set("Hello , World!", "tricky intern".getBytes ());

}

,Bernd Muller 19.4.2016 56/60

Page 125: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Fragen und Anmerkungen

Fragen und Anmerkungen

,Bernd Muller 19.4.2016 57/60

Page 126: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Referenzen

Referenzen

,Bernd Muller 19.4.2016 58/60

Page 127: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Referenzen

Referenzen

[Gonc] Antonio Goncalves: Who Cares About toStringPerformance?[Intr1] Wikipedia: Intrinsic function[Intr2] Krystal Mo. Intrinsic Methods in HotSpot VM[Bug1] JDK-6962931: move interned strings out of the perm gen[Bug2] JDK-6964458: Reimplement class meta-data storage to usenative memory[Bug3] JDK-4513622: (str) keeping a substring of a field preventsGC for object[JEP192] JEP 192: String Deduplication in G1[JEP254] JEP 254: Compact Strings[DEDUP] G1: from garbage collector to waste managementconsultant

,Bernd Muller 19.4.2016 59/60

Page 128: Was jeder Java-Entwickler über Strings wissen sollte

Was jeder Java-Entwickler uber Strings wissen sollte

Referenzen

Referenzen (cont’d)

[CHAR1] Supplementary Characters in the Java Platform[CHAR2] Supplementary Characters as Surrogates[CHAR3] Unicode Character Representations[CHAR4] Supported Encodings[CHAR5] Unicode 4.0 support in J2SE 1.5

,Bernd Muller 19.4.2016 60/60