Optimización de JVM-(1) Descripción general

¿Por qué aprender a optimizar JVM?

  • necesidades de la entrevista

Las preguntas que deben hacerse en la entrevista de una gran fábrica, la entrevista no pregunta sobre jvm, concurrencia y distribución. Aprender JVM no se trata solo de entrevistas, sino de una comprensión más profunda del lenguaje Java y sentar las bases para la resolución futura de problemas en línea.

  • Comprensión profunda del lenguaje Java.

Para los amigos que han estado trabajando durante tres años, muchas veces, cuando desea resolver un problema, debe profundizar en el nivel del código de bytes para analizarlo y puede obtener conclusiones precisas, y el código de bytes es una parte de la máquina virtual. Ejemplo: 1. Nuestro booleano booleano de uso común, todos sabemos que tiene dos valores, verdadero y falso. Pero sabe que en tiempo de ejecución, la máquina virtual Java no tiene un tipo booleano. El tipo booleano está representado por los números enteros 1 y 0 en la máquina virtual.

  • Aprender máquinas virtuales es resolver mejor los problemas de resolución de problemas en línea en el futuro

Sabemos que cuando implementamos una aplicación Java en una máquina en línea, definitivamente habrá problemas de vez en cuando. Aparte de los problemas de la red y del propio sistema, muchas veces hay un problema con la aplicación Java, lo que quiere decir que hay un problema con la memoria de la máquina virtual Java. O la memoria se desborda o el GC frecuente conduce a una respuesta lenta, etc. Entonces, ¿cómo resolver estos problemas?

Capítulo 1 Revisión de JVM

¿Qué es JVM?

  • ¿Qué es JVM?

JVM es la abreviatura de Java Virtual Machine (Java Virtual Machine). JVM es una especificación para dispositivos informáticos. Es una computadora ficticia que se realiza mediante la simulación de varias funciones informáticas en una computadora real.

  • máquina virtual convencional
nombre de la máquina virtual introducir
punto de acceso Tanto Oracle/Sun JDK como OpenJDK utilizan el mismo núcleo de HotSPot VM
J9 J9 es una JVM altamente modular desarrollada por IBM
JRockit Tanto JRockit como HotSpot pertenecen a Oracle, que hasta ahora ha estado impulsando la fusión y complementariedad de HotSpot y JRockit, dos máquinas virtuales con sus propias ventajas.
Gusto Una JVM de alto rendimiento y baja latencia mejorada por Azul Systems basada en HostPot
Dalvík Aunque Dalvik en Android no se llama JVM, es una JVM completa en sus huesos

2 JVM y sistema operativo

  • Por qué añadir una JVM entre el programa y el sistema operativo

Java es un lenguaje con un grado de abstracción particularmente alto, que proporciona una serie de características como la gestión automática de la memoria. Es imposible implementar estas funciones directamente en el sistema operativo, por lo que es necesario convertir la JVM.

inserte la descripción de la imagen aquí

Como se puede ver en la figura, con la capa de abstracción de JVM, Java puede lograr multiplataforma. La JVM solo necesita asegurarse de que los archivos .class se puedan ejecutar correctamente, y luego se puede ejecutar en plataformas como Linux, Windows y MacOS. La importancia de la multiplataforma de Java es compilar una vez y ejecutar en todas partes, y la JVM es indispensable para poder hacer esto. Por ejemplo, si descargamos el paquete jar de la misma versión en el almacén de Maven, puede ejecutarse en todas partes sin tener que volver a compilar en cada plataforma. Algunos de los lenguajes de extensión JVM actuales, como Clojure, JRuby, Groovy, etc., se compilan en archivos .class al final. Los mantenedores del lenguaje Java solo necesitan controlar el analizador JVM para ejecutar estos lenguajes de extensión sin problemas. de la JVM.

  • Relación entre aplicación, JVM, sistema operativo

inserte la descripción de la imagen aquí

Resumimos la relación entre la JVM y el sistema operativo en una oración: la JVM hereda el lenguaje de desarrollo desde arriba y se conecta al sistema operativo desde abajo, y su interfaz intermedia es bytecode.

3 Relación entre JVM, JRE y JDK

inserte la descripción de la imagen aquí

La JVM está en el corazón de cómo se pueden ejecutar los programas Java. Pero debe tenerse en cuenta que la JVM no puede hacer nada por sí misma, debe proporcionarle materias primas de producción (archivos .class). Solo la JVM no puede compilar una vez y ejecutarse en todas partes. Necesita una biblioteca de clases básica, por ejemplo, cómo operar archivos, cómo conectarse a la red, etc. El sistema Java es muy generoso y pasará todas las bibliotecas de clases requeridas para que JVM se ejecute al mismo tiempo. El estándar JVM más una gran cantidad de bibliotecas de clases básicas implementadas constituyen el entorno de tiempo de ejecución de Java, que es lo que solemos llamar JRE (Java Runtime Environment).Para el JDK, es aún más grande. Además de JRE, JDK también proporciona algunos gadgets muy útiles, como javac, java, jar, etc. ¡Es el núcleo del desarrollo de Java, que permite a los legos practicar espadas! También podemos ver la ortografía completa de JDK, Java Development Kit. Le tengo mucho miedo a la palabra kit (equipo), es como un pozo sin fondo, indicando que nunca terminarás de estudiarlo. La relación entre JVM, JRE y JDK se puede representar mediante una relación de inclusión.
inserte la descripción de la imagen aquí

4 Relación entre la especificación de la máquina virtual Java y la especificación del lenguaje Java

inserte la descripción de la imagen aquí

La mitad izquierda es la especificación de la máquina virtual de Java, que en realidad proporciona un entorno operativo para ingresar y ejecutar códigos de bytes. La mitad derecha es la especificación de gramática de Java que solemos decir, como switch, for, generics, lambda y otros programas relacionados, que eventualmente se compilarán en bytecode. El puente que conecta las partes izquierda y derecha sigue siendo un código de bytes de Java. Si la especificación del archivo .class es constante, estas dos partes se pueden optimizar de forma independiente. Pero Java también expande ocasionalmente el formato del archivo .class, agregando algunas instrucciones de código de bytes para admitir más funciones. Podemos considerar la máquina virtual Java como una computadora abstracta, que tiene su propio conjunto de instrucciones y varias áreas de memoria en tiempo de ejecución. Los estudiantes que hayan estudiado "Estructura de composición de computadora" verán muchas similitudes más adelante en el curso.

Finalmente, echemos un breve vistazo al proceso de ejecución de un programa Java y cómo se ejecuta.
inserte la descripción de la imagen aquí
El programa Java aquí está en formato de texto. Por ejemplo, la siguiente sección de HelloWorld.java sigue la especificación del lenguaje Java. Entre ellos, llamamos módulos como System.out, que es la biblioteca de clases proporcionada en JRE.

public class HelloWorld {
    
    
	public static void main(String[] args) {
    
    
		System.out.println("Hello World");    
	}
}

Después de compilar con la herramienta javac de JDK, se generará el bytecode de HelloWorld. Hemos estado diciendo que el código de bytes de Java es un puente entre los programas JVM y Java. Usemos javap para ver cómo se ve el código de bytes.

0 getstatic #2 <java/lang/System.out> // getstatic 获取静态字段的值

3 ldc #3<HelloWorld> // ldc 常量池中的常量值入栈

5 invokevirtual #4 <java/io/PrintStream.println> // invokevirtual   运行时方法绑定调用方法

8 return //void 函数返回

La máquina virtual Java utiliza una arquitectura basada en pilas y sus instrucciones consisten en códigos de operación y operandos. Estas instrucciones de código de bytes se denominan códigos de operación. Entre ellos, getstatic, ldc, invocavirtual, return, etc. son códigos de operación, que son relativamente fáciles de entender. La JVM completa la ejecución del programa analizando estos códigos de operación y operandos. Cuando usamos el comando Java para ejecutar un archivo .class, en realidad es equivalente a iniciar un proceso JVM.
La JVM luego traduce estos bytecodes, que se pueden ejecutar de dos maneras. El común es interpretación y ejecución, que traduce el código de operación + operandos en código de máquina; otro método de ejecución es JIT, que es lo que a menudo llamamos compilación justo a tiempo, que compila el código de bytes en código de máquina bajo ciertas condiciones antes de ejecutarlo.

Supongo que te gusta

Origin blog.csdn.net/qq_31686241/article/details/128050495
Recomendado
Clasificación