Introducción: el análisis de escape es un punto técnico que no se utiliza en muchas tecnologías JVM. Este artículo analizará sus escenarios de uso a través de un ejemplo.
El análisis de escape es un algoritmo de análisis de flujo de datos global multifuncional que puede reducir efectivamente la presión de carga sincrónica y la presión de asignación de montón de memoria en los programas Java. A través del análisis de escape, el compilador de punto de acceso Java puede analizar el alcance de uso de la referencia de un nuevo objeto y determinar si asigna el objeto al montón.
En el principio de optimización del compilador de lenguaje informático, el análisis de escape se refiere al método para analizar el rango dinámico de punteros, que se asocia con el análisis de puntero y el análisis de apariencia del principio de optimización del compilador. Cuando se asigna una variable (u objeto) en un método, su puntero puede ser devuelto o referenciado a nivel mundial, a lo que será referenciado por otros procesos o hilos. Este fenómeno se llama escape del puntero (o referencia).
Java admite y permite opciones de análisis de escape en Java SE 6U23 y versiones posteriores. El compilador JIT del punto de acceso de Java puede realizar un análisis de escape en el código cuando el método se sobrecarga o se carga dinámicamente. Al mismo tiempo, las características de los objetos Java que se asignan en el montón y los hilos incorporados hacen que el análisis de escape sea una función importante de Java.
El párrafo anterior es un pasaje que cité de otra persona. El artículo utiliza muchos términos profesionales. Déjame resumir su significado:
El análisis de escape se usa para determinar si ciertas instancias o variables se asignan en el montón. Si el análisis de escape está habilitado, estas variables se pueden asignar directamente en la pila en lugar de en el montón. Los punteros a estas variables pueden ser referenciados a nivel mundial o referenciado por otros hilos.
Encender la configuración
El valor predeterminado está habilitado en JDK 6U23 o superior. Aquí volveremos a definir la configuración:
Obligado a abrir
-server -xx:+doescapeanalysis -xx:+printgcdetail -xmx10m -xms10m
Análisis de escape
-server -xx: -docapeanalysis -xx:+printgcdetail -xmx10m -xms10m
Verificación de instancia
Código:
clase pública OnstackTest {public static void alloc () {byte [] b = new byte [2]; b [0] = 1; } public static void main (string [] args) {long b = system.currentTimemillis (); para (int i = 0; i <100000000; i ++) {alloc (); } long e = system.currentTimemillis (); System.out.println (e - b); }}Enciende los resultados de la operación de escape:
Escribe una descripción de una imagen aquí
Ejecución de resultados del análisis de escape no habilitado:
Escribe una descripción de una imagen aquí
Para analizar, aquí es asignar 2 bytes de ciclos de datos de 10 millones de veces, el tiempo de ejecución para el escape activado es 8 milisegundo, mientras que el no activado es 956, que es casi 1/120 de no activado.
El efecto de diferencia sigue siendo muy obvio ...
El espacio en la pila es generalmente muy pequeño, y solo puede almacenar varios cambios y pequeñas estructuras de datos, y no se pueden lograr estructuras de almacenamiento de gran capacidad. El ejemplo aquí es una decena extrema de millones de veces, destacando el análisis de escape, lo que permite que se asigne directamente desde la pila, lo que reduce en gran medida el número de GC y mejora la eficiencia general de ejecución del programa.
Por lo tanto, el efecto del análisis de escape solo puede entrar en efecto en escenarios específicos, que cumple con la estructura de asignación variable con una capacidad relativamente pequeña con alta frecuencia y alto número.