La nueva ronda de optimización de JDK9 para cadenas de cadenas, debe saber

Se puede decir que la clase String es la clase más utilizada en la programación Java. Si se puede optimizar el rendimiento de la cadena String, el rendimiento del programa inevitablemente mejorará enormemente.

Esto no requiere que JDK9 mejore y actualice la cadena de cadenas. En algunos escenarios, puede reducir la memoria de cadenas de cadenas a la mitad, reduciendo así el número de GC de la JVM.
Almacenamiento subyacente de String

En las entrevistas, solemos decir que las cadenas de cadenas son inmutables y que se debe crear una nueva cadena cada vez. Entonces, ¿por qué String es inmutable?

Veamos primero la estructura de almacenamiento subyacente de String:

La cadena de clase final pública
implementa java.io.Serializable, Comparable <String>, CharSequence {

private final char value[];

public String() {
    this.value = "".value;
}

public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
}
// ...

}

¿Que ves? Cuando creamos un objeto String, la cadena correspondiente se almacena en el objeto String en forma de matriz de caracteres. Y esta matriz de caracteres es definitiva, es decir, inmutable.

Es por eso que decimos que las cadenas de caracteres tienen características inmutables.Cuando la cadena cambia y la matriz de caracteres es inmutable, solo puede crear un nuevo objeto, una nueva matriz de caracteres.
Optimización del almacenamiento subyacente

La situación mencionada anteriormente es JDK8 y versiones anteriores.En JDK9, el almacenamiento de cadenas en String ya no usa matrices de caracteres, sino que usa matrices de bytes.

La cadena de clase final pública
implementa java.io.Serializable, Comparable <String>, CharSequence {

@Stable
private final byte[] value;

private final byte coder;

@Native static final byte LATIN1 = 0;
@Native static final byte UTF16  = 1;

static final boolean COMPACT_STRINGS;

public String() {
    this.value = "".value;
    this.coder = "".coder;
}

@HotSpotIntrinsicCandidate
public String(String original) {
    this.value = original.value;
    this.coder = original.coder;
    this.hash = original.hash;
}

// ...

}

No solo cambió la matriz de caracteres a una matriz de bytes, sino que también agregó una variable miembro del codificador.

En el programa, la mayoría de las cadenas solo contienen caracteres alfanuméricos en inglés, utilizando codificación Latin-1, y un carácter ocupa un byte. Si usa char, un char ocupará dos bytes, lo que duplicará el espacio de memoria.

Sin embargo, si se usan caracteres chinos en la cadena que exceden el rango Latin-1, no hay forma de usar Latin-1. En este momento, JDK usará codificación UTF-16, por lo que el espacio ocupado es el mismo que en la versión anterior (usando char []).

La variable codificadora representa el formato de codificación. Actualmente, String admite dos formatos de codificación Latin-1 y UTF-16. Latin-1 necesita usar un byte para almacenar, mientras que UTF-16 necesita usar 2 bytes o 4 bytes para almacenar.

Se dice que esta mejora se basa en el uso de big data e inteligencia artificial por parte de los desarrolladores de JDK. Luego de investigar la información de heapdump de miles de aplicaciones, se concluye que la mayoría de las Strings están expresadas en codificación de caracteres Latin-1., Solo se necesita un byte para el almacenamiento y dos bytes son un desperdicio total.

El atributo COMPACT_STRINGS se utiliza para controlar si se habilita la función compacta de String. Está activado de forma predeterminada. Puede utilizar el parámetro -XX: -CompactStrings para desactivar esta función.
Los beneficios de la mejora

Los beneficios de la mejora son muy obvios: primero, si el juego de caracteres Latin-1 se usa principalmente en el proyecto, el uso de memoria se reduce considerablemente y la misma configuración de hardware puede soportar más negocios.

Cuando se reduce la memoria, se reducirá aún más el número de GC, reduciendo así la frecuencia de Stop-The-World, lo que también mejorará el rendimiento del sistema.
resumen

Con la iteración del JDK, la estructura de la memoria y los métodos de las cadenas de cadenas evolucionan constantemente. Esto se debe a que String es a menudo la clase que ocupa más memoria en la JVM. A través de su transformación y actualización, la mejora del rendimiento será más obvia.
————————————————

Supongo que te gusta

Origin blog.51cto.com/2096101/2657212
Recomendado
Clasificación