Una parte esencial del aprendizaje de Java --- análisis JVM (1.3)

Problemas con el compilador Just-In-Time de Java

  • ¿Por qué la JVM necesita utilizar una arquitectura en la que coexistan un intérprete y un compilador?
  • ¿Por qué la JVM implementa dos compiladores diferentes?
  • ¿Cuándo se ejecutará el programa utilizando el intérprete? ¿Cuándo se ejecutará con un compilador?
  • ¿Qué código de programa se compilará en código nativo? ¿Cómo compilar?
  • ¿La eficiencia de ejecución del código Java debe ser peor que la de la ejecución estática de C y C ++? ¿Cuáles son las ventajas del análisis y la ejecución de código Java?

1. ¿Por qué la máquina virtual HotSpot utiliza una arquitectura en la que coexisten un intérprete y un compilador?

    尽管并不是所有的Java虚拟机都采用 解释器与编译器并存的架构,但许多主流的商用虚拟机(eg:HotSpot),
都同时包含解释器和编译器?

Tanto el intérprete como el compilador tienen sus propias ventajas

  • Cuando el programa necesita ser iniciado y ejecutado rápidamente , el intérprete puede jugar un papel primero, ahorrar tiempo de compilación y ejecutarlo inmediatamente. Después de que el programa se ejecuta, a medida que pasa el tiempo, el compilador entra en juego gradualmente, agregando más y más códigos Después de compilar el código nativo, puede obtener una mayor eficiencia de ejecución.
  • Cuando el límite de recursos de memoria en el entorno de ejecución del programa es grande (como en algunos sistemas integrados), puede usar el intérprete para ejecutar para ahorrar memoria ; de lo contrario, puede usar el compilador para ejecutar y mejorar la eficiencia

Compilar tiempo de sobrecarga

La ejecución del intérprete se ve así en términos abstractos:
Código ingresado -> [intérprete para explicar y ejecutar] -> resultado de ejecución
Si necesita ejecutarse después de la compilación JIT, el aspecto abstracto es:
Código de entrada -> [Compilador Compilador] -> Código compilado -> [Ejecutar] -> Resultado de ejecución

Se dice que JIT es más rápido que la interpretación. De hecho, se dice que "ejecutar el código compilado" es más rápido que "el intérprete interpreta y ejecuta". No significa que la acción de "compilar" sea más rápida que la acción de "interpretar". No importa qué tan rápido compile JIT, al menos También es un poco más lento que la interpretación y ejecución una vez, y para obtener el resultado final de la ejecución tiene que pasar por un proceso de "ejecución del código compilado". Por lo tanto, para el código de "ejecución sólo una vez", la interpretación y ejecución son en realidad más rápidas que la compilación y ejecución JIT.

¿Cómo es "código que se ejecuta sólo una vez"? En términos generales, satisfacer las dos condiciones siguientes al mismo tiempo es un estricto "ejecutar solo una vez"

  • Solo se llama una vez, como el constructor de una clase
  • No hay bucle
    . Se puede decir que vale la pena perder la compilación JIT y luego ejecutar el código que se ejecuta solo una vez
    . El código se ejecuta solo una pequeña cantidad de veces. El aumento en la velocidad de ejecución que trae la compilación JIT puede no compensar la sobrecarga causada por la compilación inicial.

Solo para el código ejecutado con frecuencia, la compilación JIT puede garantizar beneficios positivos

Compilar sobrecarga de espacio

Para los métodos generales de Java, es normal que el tamaño del código compilado tenga una proporción de expansión de 10 veces en relación con el tamaño del código de bytes. Al igual que la sobrecarga de tiempo mencionada anteriormente, la sobrecarga de espacio aquí también lo es. Solo vale la pena compilar el código ejecutado con frecuencia. Si se compila todo el código, aumentará significativamente el espacio de código y causará una "explosión de código".

Esto también explica por qué algunas JVM eligen no hacer siempre la compilación JIT, sino que eligen utilizar un motor de ejecución híbrido de intérprete + compilador JIT.

2. ¿Por qué la máquina virtual HotSpot implementa dos compiladores justo a tiempo diferentes?

HotSpot虚拟机中内置了两个即时编译器:Client Complier和Server Complier,分别用在客户端和服务器端

La máquina virtual HotSpot convencional actual funciona de manera predeterminada de manera que el intérprete trabaja directamente con uno de los compiladores . El compilador que utiliza el programa depende del modo en el que se ejecuta la máquina virtual. La máquina virtual HotSpot selecciona automáticamente el modo de funcionamiento de acuerdo con su propia versión y el rendimiento del hardware de la máquina host. El usuario también puede usar el parámetro "-client" o "-server" para forzar que la máquina virtual designada se ejecute en modo Cliente o Servidor.

Utilice Client Complier para obtener una mayor velocidad de compilación y Server Complier para obtener una mejor calidad de compilación . Por qué proporcionar varios compiladores justo a tiempo es similar a por qué se proporcionan varios recolectores de basura, ambos para diferentes escenarios de aplicación

3. ¿Qué códigos de programa se compilarán?

El diam en el programa solo se compilará en código nativo cuando sea un código activo. Entonces, ¿qué es un "código activo"?
Hay dos tipos de "códigos calientes" que serán compilados por el compilador Just-In-Time durante la operación:

  • Métodos que se llaman varias veces
  • Cuerpo del bucle que se ejecuta varias veces En
    ambos casos, el compilador toma el método completo como destino de compilación. Este tipo de método de compilación se llama reemplazo en la pila porque la compilación ocurre durante la ejecución del método, es decir, el marco de la pila del método todavía está en la pila y el método se reemplaza

4. ¿Cómo determinar el código caliente?

Para saber si un método o un fragmento de código es un código activo y si necesita activar la compilación en tiempo real, se requiere la detección de puntos calientes.
Actualmente, existen dos métodos principales de detección de puntos calientes:

  • Detección de puntos calientes basada en muestreo

La máquina virtual que utiliza este método comprueba periódicamente la parte superior de la pila de cada hilo. Si encuentra que algunos métodos aparecen a menudo en la parte superior de la pila, entonces este método es un "método activo". La ventaja de este método de detección es que es simple y eficiente de implementar, y también puede obtener fácilmente la relación de llamada al método (simplemente expanda la pila de llamadas). La desventaja es que es difícil confirmar con precisión la popularidad de un método y es fácil ser bloqueado por subprocesos u otras personas externas. Factores que interrumpen la detección de puntos calientes

  • Detección de puntos calientes basada en puntos de conteo

La máquina virtual que utiliza este método establece un contador para cada método (bloque de código par) y cuenta el número de ejecuciones del método. Si el número de ejecuciones supera un cierto umbral, se considera un método caliente. Este tipo de método estadístico es más complicado de implementar, necesita establecer y mantener un contador para cada método, y la relación de llamada al método no se puede obtener directamente, pero sus resultados estadísticos son relativamente más precisos y rigurosos.

5. ¿Qué método de detección de puntos calientes se utiliza en la máquina virtual HotSpot?

    在HotSpot虚拟机中使用的是第二种--基于计数器的热点探测方法,因此它为每个方法准备了两个计数器:
方法调用计数器和回边计数器。在确定虚拟机运行参数的前提下,这两个计数器都有一个确定的阈值,当计数器
超过阈值溢出了,就会触发JIT编译

Contador de llamadas a métodos
Como su nombre lo indica, este contador se utiliza para contar el número de veces que se ha llamado a un método
Inserte la descripción de la imagen aquí

Contador de back-edge
Su función es contar el número de veces que se ejecuta el código del cuerpo del bucle en un método . En el bytecode, la instrucción de que el flujo de control retrocede se llama "back-edge"

6. ¿Cómo compilar en código nativo?

El proceso de compilación de Server Complier y Client Complier es diferente

Para Client Complier, es un compilador simple y rápido, el enfoque principal está en la optimización local y abandona muchos métodos de optimización global que consumen mucho tiempo.

El Server Complier está específicamente orientado al servidor y especialmente ajustado para la configuración del rendimiento del servidor. Es un compilador de alto nivel totalmente optimizado

Supongo que te gusta

Origin blog.csdn.net/qq_44787898/article/details/109097377
Recomendado
Clasificación