Hola de nuevo Abrimos el siguiente set en el, ahora noveno, grupo
"Desarrollador Java" (y el décimo grupo en los planes, de repente, está de pie el 31 de diciembre) y hemos preparado materiales interesantes y
una lección abierta para usted.
Entonces vamos.
¿Desea reducir la cantidad de memoria utilizada por su aplicación Java? Vea cómo puede mejorar el rendimiento con las cadenas compactas disponibles en Java 9.
Una de las mejoras de rendimiento introducidas en la JVM (Oracle HotSpot, para ser precisos), como parte de Java SE 9, resultó ser cadenas compactas. Su tarea es reducir el tamaño de los objetos String, lo que permite reducir la cantidad total (huella) de memoria consumida por la aplicación. Como resultado, esto puede reducir la cantidad de tiempo dedicado a recolectar basura.

La función se basa en la observación de que muchos objetos String no necesitan 2 bytes para codificar cada carácter, ya que la mayoría de las aplicaciones usan solo caracteres Latin-1. Por lo tanto, en lugar de esto:
private final char value[];
En
java.lang.String
ahora tiene esto:
private final byte[] value; private final byte coder;
En otras palabras, esta función reemplaza el valor en la matriz de caracteres (donde cada elemento usa 2 bytes) con una matriz de bytes con un byte adicional para determinar la codificación (Latin-1 o UTF-16). Esto significa que en la mayoría de las aplicaciones que usan solo caracteres Latin-1, solo se usará la mitad del montón. El usuario no notará las diferencias, pero las API relacionadas, como
StringBuilder
, lo aprovecharán automáticamente.
Para mostrar este cambio en términos del tamaño del objeto String, usaré Java Object Layout, una sencilla utilidad para visualizar la estructura del objeto en el montón. Desde este punto de vista, estamos interesados en la huella de la matriz (almacenada en la variable de valor anterior), y no solo en una referencia (una referencia de matriz de bytes, como una referencia de matriz de caracteres, usa 4 bytes). El siguiente código muestra la información utilizando
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()); } }
Ejecutar el código anterior en Java 8 y luego en Java 9 muestra la diferencia:
$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)
Ignorando el tamaño de 24 bytes de los componentes internos de java.lang.String (encabezado más enlaces), vemos que, debido a su tamaño compacto, el tamaño casi se ha reducido a la mitad.
Si reemplazamos la línea de arriba con otra usando caracteres UTF-16, por ejemplo \ u0780, y luego reiniciamos el código de arriba, tanto Java 8 como Java 9 mostrarán la misma huella, ya que la compactación ya no se usará.
Puede deshabilitar esta función pasando el
-XX:-CompactStrings
al comando
java
.
Como siempre, estamos esperando sus comentarios y preguntas aquí, así como también lo invitamos a
una lección abierta .