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
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
- Para cargar una clase, primero encuentre el flujo de bytes binarios de esta clase por su nombre completo
- Convierta la estructura estática de la secuencia de bytes en la estructura de tiempo de ejecución del área de método
- 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:
Determina el orden:
2. Cargador de clases
Diferenciar si dos clases son iguales depende de si los cargadores de clases son iguales y el cargador de clases
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
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
-
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.
-
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