Comprensión profunda de las notas de estudio de JVM

Comprensión profunda de las notas de estudio de la máquina virtual JVM

Después de leer la JVM dos veces, muchos lugares todavía parecen entender

Combina algunos artículos en el libro y reorganiza

Es bueno entender el libro de jvm en profundidad, pero siente que tiene sus limitaciones.

Organiza el núcleo

La conversación es caótica y no tiene sentido.

La diferencia entre jdk 1.7 y 1.8 sigue siendo muy grande.

Vista previa general
Inserte la descripción de la imagen aquí

1. Mecanismo de carga de clase

El mecanismo de carga de la clase no siempre está claro, hay muchas preguntas de entrevista como cargar la clase de prueba

5 procesos

  • Cargando

    1. Para cargar una clase, primero encuentre el flujo de bytes binarios de esta clase por su nombre completo
    2. Convierta la estructura estática de la secuencia de bytes en la estructura de tiempo de ejecución del área de método
    3. Genere un objeto de clase en la memoria como una entrada al acceso al área de método, como la reflexión necesita un objeto de clase
  • Verificar

    Es verificar la razonabilidad incluyendo

    Formato de archivo, número de versión y similares

    Metadatos, ¿hay alguno que no se ajuste a la especificación del lenguaje Java?

    Bytecode, para garantizar algunos problemas de conversión, las instrucciones son correctas

  • Listo

    Inicialice el valor de la variable miembro estática al valor predeterminado

  • Analizando

    La referencia del símbolo se convierte en una referencia directa. En pocas palabras, es un puntero

    • Resolución de clase e interfaz

      Análisis de la categoría C, dividido en dos casos.

      1.C no es un tipo de matriz y puede necesitar cargar la clase y la interfaz principal

      2.C es un tipo de matriz, y el elemento es un objeto, primero cargue el objeto como Integer

    • Análisis de método de clase

      1. Verifique el nombre directamente y regrese a la referencia

      2. No marcado en la clase padre

      3. Compruebe la interfaz y la interfaz principal, si hay una clase abstracta

  • Inicializar

    Inicializar variables miembro y bloques de código estático

    Combina el conocimiento en ideas de programación JAVA

    El orden de ejecución es

    Inicialización de clase principal> Inicialización de clase secundaria

    Variables estáticas Bloques de código estático (consulte el orden de escritura en el mismo nivel) Inicialización> Variables de miembros comunes (bloques de código)> Constructor

    Mira el código

    package test;
    
    public class Father {
        //------- 这两个顺序只和书写顺序有关
        private static String staticfiled = getStaticfiled();
        static {
            System.out.println("父类->静态代码块");
        }
        // -------
    
        private String field =getNormalfiled();
    
        public String getNormalfiled(){
            System.out.println("父类->普通成员变量初始化");
            return "hah";
        }
        public static String getStaticfiled(){
            System.out.println("父类->静态成员变量初始化");
            return "haha";
        }
        // 普通方法块
        {
            System.out.println("父类->普通方法块");
        }
        public Father(){
            System.out.println("父类->构造函数");
        }
    
    
    }
    
    
    package test;
    
    public class Son extends Father {
        //------- 这两个顺序只和书写顺序有关
        private static String staticfiled = getStaticfiled();
        static {
            System.out.println("子类->静态代码块");
        }
        // -------
    
        private String field =getNormalfiled();
    
        @Override
        public String getNormalfiled(){
            System.out.println("子类->普通成员变量初始化");
            return "hah";
        }
        public static String getStaticfiled(){
            System.out.println("子类->静态成员变量初始化");
            return "haha";
        }
        // 普通方法块
        {
            System.out.println("子类->普通方法块");
        }
        public Son(){
            System.out.println("子类->构造函数");
        }
        // 在子类中main函数 是仅此慢于静态代码块和静态变量
        public static void main(String[] args) {
            System.out.println("在子类中的main主函数");
            Son son = new Son();
        }
    }
    

    Mira el gráfico de resultados:
    Inserte la descripción de la imagen aquí

    Determina el orden:
    Inserte la descripción de la imagen aquí

2. Cargador de clases

Diferenciar si dos clases son iguales depende de si los cargadores de clases son iguales y el cargador de clases

Inserte la descripción de la imagen aquí

Modelo de delegación principal

El modelo de delegación principal es una estructura de este tipo.

Se dice que los padres no son padres, porque no son heredados, sino combinados.

El cargador de clases recibe la solicitud para cargar la clase,

Primero deje que el cargador de clases padre intente cargar,

El cargador de clases padre recibe la solicitud y no puede entregarla al cargador de clases hijo

Esto es lo opuesto al direccionamiento dns. Si dns no puede encontrar la IP, se entregará al servidor raíz dns para verificar.

La diferencia es que la clase padre del cargador no funciona en la subclase

El servidor dns local dns no se puede entregar a la raíz dns

Esta es también una razón por la cual el objeto es la clase padre de todas las clases.

Vale la pena señalar que las clases que se han cargado se almacenarán en caché y no tendrán que cargarse y usarse la próxima vez.

3. Estructura de memoria de tiempo de ejecución JVM

La diferencia entre la estructura de memoria de tiempo de ejecución JVM y JMM (modelo de memoria JAVA)

La estructura de memoria de tiempo de ejecución de JVM está en JVM, el modelo de memoria JAVA es para estudiar la relación del intercambio de memoria de subprocesos múltiples

Aquí estamos discutiendo la estructura de memoria de tiempo de ejecución JVM

Inserte la descripción de la imagen aquí
Las preguntas de la entrevista de cadena les gusta probar el grupo constante de cadenas y las preguntas de referencia

Algunas preguntas clásicas de entrevista

  1. String str = new String ("11") creó varias cadenas

    Cree una o dos cadenas, si el grupo constante de cadenas tiene este objeto, solo cree una en el montón

    De lo contrario, cree uno en el montón y otro en el conjunto de cadenas constantes.

  2. El método intern () de String devuelve una cadena en un grupo constante. Si el grupo constante no existe, únase al grupo constante y devuelva

4. Asignación de memoria de objetos y recolección de basura.

La recolección de basura es principalmente para reciclar objetos en el montón

La asignación de memoria de objeto también se asigna en el montón del montón

El objeto en el área de reciclaje de Eden es MinorGC

Reciclar la vieja generación es FullGC

Cómo determinar si un objeto está muerto o si debe reciclarse

  • 1. Método de conteo de referencia

    No debe reciclarse mientras la referencia siga ahí.

  • 2. Algoritmo de accesibilidad

    Este algoritmo es como un árbol binario, atravesando desde el nodo raíz GCroot

    Los objetos encontrados son útiles, los no encontrados son inútiles

    Los objetos GCroot tienen

    El objeto al que se hace referencia en el marco de la pila es la variable local del método

    Objetos estáticos en el área del método.

    Área de método objeto de referencia constante

Algoritmo de recolección de basura

  • Marca clara

    Causará fragmentación del espacio de memoria no es fácil de organizar

  • Copia (aplicable a la muerte en la víspera de la vida)

    Dividir en varios bloques, copiar un bloque determinado en el mismo bloque, luego borrar

    En la nueva generación

    Del Edén + del espacio al espacio es un proceso así

  • Marcado (para objetos de larga vida)

    Marque vivo para moverse a un extremo de la memoria

  • Generacional (generalmente este es el caso)

Cada limpieza requiere un algoritmo de accesibilidad,

Entonces esto requiere referencias a todos los objetos, por velocidad,

La JVM usa la estructura de datos OopMap para saber que hay referencias a objetos

Al mismo tiempo, la limpieza necesita suspender todos los hilos, para que STW (pare el mundo)

Pause el hilo, causará un impacto de seguridad, por seguridad, la JVM solo está en el punto de seguridad stw

Proceso completo de GC

Recolector de basura

Hay muchos tipos de colectores, que requieren una combinación de diferentes colectores de nueva generación y colectores de la vieja generación.

  • De serie

    La recuperación en serie de un solo hilo de la copia de la nueva generación, la compresión de marca de la generación anterior, continuará

  • ParNew

    Serial multihilo Cenozoico paralelo generación anterior replicación Cenozoico en serie, compresión de marca de generación anterior

    Parámetro:

    -XX: + UseParNewGC ParNew collector

    -XX: ParallelGCThreads limitan el número de hilos

  • Paralelo

    Similar a la serie, con énfasis en el rendimiento

  • Paralelo viejo

    Vieja generación, usa marcado

  • CMS (Old Generation) se centra en el tiempo de respuesta

    Barrido de marca simultáneo de 4 pasos

    La marca inicial (marca inicial de CMS) tiene marca STW. Gcroots puede alcanzar el objeto por poco tiempo.

    Marca concurrente (marca concurrente CMS) Se tarda mucho tiempo en buscar los nodos hijos de gcroot

    El comentario (comentario de CMS) tiene un tiempo STW corto

    El barrido concurrente (barrido concurrente de CMS) lleva mucho tiempo

  • G1 es actualmente el más fuerte (nuevo y antiguo puede ser)

    Marcado, sin fragmentación del espacio de memoria, la nueva generación y la vieja generación no son necesariamente continuas en la memoria

    Divida el montón en regiones del mismo tamaño.

    Puede predecir el tiempo de pausa

    El proceso de limpieza es similar al CMS.

    5 pasos

    1. El marcador desencadena minorGC

    2. Escaneo de región

    3. Exploración concurrente de todo el montón

    4. Marcado con stw nuevamente

    5. La eliminación simultánea tiene stw

22 artículos originales publicados · Me gusta2 · Visitas 881

Supongo que te gusta

Origin blog.csdn.net/weixin_41685373/article/details/105037810
Recomendado
Clasificación