Charla diversa sobre JVM (escritura a mano 4D)

secuencia

He estado aprendiendo jvm durante medio mes, para no olvidarme después de aprender, escribe este blog.

memoria en tiempo de ejecución jvm

La memoria en tiempo de ejecución de jvm es un buen punto de entrada para aprender jvm, que se enumera aquí:

Pila de máquinas virtuales : A los ojos de mil personas, hay mil Hamlet y mil subprocesos tienen mil pilas de máquinas virtuales. Desde la perspectiva del sistema operativo, los subprocesos a nivel de usuario se ejecutan en diferentes pilas, ya que El hermano mayor del sistema operativo es así, el hilo de la jvm debe ser un hilo y una pila. ¿Qué hay en una pila de máquina virtual? Mire la pila del hermano mayor, hay marcos de pila uno por uno, y el jvm es naturalmente un marco de pila ( El marco de pila es el método). Además del marco de pila, jvm también tiene un pequeño contador de programa que se puede ignorar (el contador de programa registra la ubicación de cada hilo en ejecución, lo cual es conveniente para el cambio de hilo), y el sistema operativo tiene tcb (ThreadControllerTable), que puede grabarse a sí mismo Dónde se ejecuta, por lo que no hay necesidad de un contador de programa. Por lo tanto, no existe tal concepto. Entonces, ¿qué hay en el marco de pila? El jvm se divide en muy detallado, pila de operandos, tabla de variables locales, enlace dinámico, retorno Dirección .

¿Qué es la pila de operandos ? En el sistema operativo, de acuerdo con las instrucciones, los datos que deben operarse se colocan en el grupo de registros, y luego se realiza la operación, y los datos en el medio de la operación se almacenan en el registro para almacenamiento temporal. Finalmente, si el resultado debe guardarse, entonces Guárdelo en el marco de la pila (memoria). ¿Cuál es la pila de operandos de la jvm? Creo que esto es solo un concepto abstracto. Depende de la capa inferior específica de la jvm para reproducir y escribir, tal vez sea una caché de primer nivel o un registro , Siempre que su velocidad de lectura sea lo suficientemente rápida para cumplir con los requisitos de JVM, debería ser casi la misma. Ejem, y luego miré << Comprensión en profundidad de la máquina virtual Java >> y encontré la respuesta. Resultó ser dos estructuras de conjuntos de instrucciones diferentes. Java usa una estructura de conjunto de instrucciones basada en pila, mientras que el sistema operativo usa una estructura de conjunto de instrucciones basada en registros. La diferencia entre ellos es que la estructura de conjunto de instrucciones basada en pila no necesita prestar atención a los registros, lo que la hace portátil, sino a la velocidad. Es más lento porque requiere operaciones de apilamiento frecuentes. La estructura del conjunto de instrucciones basada en registros es compatible con las CPU convencionales. El libro también menciona que JVM mapea operaciones comunes a registros, y también usa el caché superior de la pila para acelerar las instrucciones Velocidad de cálculo, parece que mis ideas anteriores no están del todo equivocadas. (<< Comprensión en profundidad de la máquina virtual Java >> ¡¡¡Niubi !!!)

¿Qué es la tabla de variables locales ? No hay nada que decir sobre esto. Desde el comienzo de Java, la tabla de variables locales siempre ha sido tratada como una pila por mí . ¿Qué transferencia de valor y transferencia de dirección me marea? Parece que el lenguaje C puede La transferencia de valores personalizados sigue siendo la transferencia de direcciones (tal vez no), pero Java está codificado. El tipo de datos básico es la transferencia de valores y otros objetos son la transferencia de direcciones. Estos valores y direcciones son métodos privados, por lo que, por supuesto, hay todos los En la tabla de variables locales de un marco de pila. El objeto coloca la dirección en la tabla de variables locales

Con la vinculación dinámica , está más lejos y se puede tirar durante mucho tiempo. C también tiene vinculación dinámica. Es para resolver algunas direcciones que se pueden determinar cuando necesitan ser llamadas. No se puede escribir la dirección directamente. Luego, cambie el código. ¿Deben cambiarse todas las direcciones? Además, no sabes dónde está tu dirección después de cargarla en la memoria. El enlace dinámico en Java es un proceso de conversión de referencias simbólicas en referencias directas. ¿Por qué se llama dinámico? Debido a que la referencia directa de esta referencia de símbolo se determina en tiempo de ejecución, ¿ cuándo ocurrirá el enlace dinámico ? En la reescritura de Java, hay polimorfismo, y el proceso de reescritura es verificar el tipo real (A Heredar el método de B, A a = new B () En este momento, B es el tipo real de a). Si lo hay, naturalmente se llama directamente. De lo contrario, es necesario encontrar su clase padre. Si no lo es, es el padre de la clase padre Class to find, luego se producirá el enlace dinámico, porque ocurre en tiempo de ejecución, y la referencia simbólica se reemplaza con una referencia directa después de encontrar un método adecuado (la sensación de reescritura y el mecanismo de delegación padre del cargador de clases incorporado son lo opuesto Viniendo )

La dirección de retorno significa literalmente que, después de que se ejecuta el método, el marco de la pila está fuera de la pila, luego debe volver al marco de la pila anterior para ejecutarlo, esto es para registrar dónde ejecutó el último marco de la pila

2. Montón : el gran jefe en la memoria en tiempo de ejecución de Java se puede llamar hegemonía. ¿Por qué es una hegemonía, porque generalmente es la pieza más grande? Hay un área de método en el montón (el hotspot en 1.8 es el metaespacio ), La vieja generación , la nueva generación, estos tres gigantes

Un gigante muy estable en el área de métodos . Algunos de sus sujetos básicamente nacieron y se establecieron aquí cuando el caos se abrió por primera vez (cuando se ejecutó el paquete jar), y algunos nacieron en tiempo de ejecución (clase cargada en) ), se ha deshecho de los Seis Caminos de la Reencarnación (YonugGc), pero es difícil escapar a la remodelación del día (FullGc), incluso si es fullgc, no es tan fácil reciclarlos, el cielo real es inagotable y la tierra es difícil de enterrar. ¿Cuáles son los roles de los residentes adentro? Runtime Constant Pool (Runtime Constant Pool) datos de campo y método, el contenido de código de bytes de constructores y métodos comunes, y algunos métodos especiales utilizados en la inicialización de clases, instancias e interfaces. Además, el área de métodos es solo una especificación , La implementación específica varía según la versión de jdk y el fabricante .

La vejez es un lugar de reunión para algunas antigüedades. A través de los esfuerzos de pasado mañana, básicamente se deshicieron del sufrimiento de los Seis Caminos de la Reencarnación (YonugGc), pero tampoco pudieron escapar de la remodelación del cielo y la tierra (FullGc). Además: algunos tipos con fuerza natural ( grande Asunto ) pueden mezclarse fácilmente con la vejez, y pueden ser una de las pesadillas de la remodelación del mundo.

En el lugar donde el faro de la nueva generación está en todas partes, todos sufren estas seis reencarnaciones (YonugGc). Si quieres sobrevivir, debes tener a alguien arriba (la raíz es alcanzable ). La nueva generación se divide en tres áreas: Edén, Desde y A. Solo a través del ciclo de renacimiento ( YoungGc , que ha experimentado 16 veces de forma predeterminada ), puede sobrevivir a la vejez, por lo que no tiene que preocuparse por eso todos los días.

3. Pila de métodos locales : en el caso de la pila de métodos locales, es así cuando se compara con el sistema operativo. El lenguaje C no puede usar directamente el hardware, por lo que el sistema operativo proporciona apis de llamadas al sistema para el uso del lenguaje C, y Jvm es el hermano menor de imitar el sistema operativo No puede llamar al sistema, por lo que encapsula directamente la pila de métodos locales (escrita en lenguaje C) y se la proporciona a Java para que la invoque y realice el control del hardware.

4. Memoria directa : la memoria directa ha estado fuera del control de jvm. Generalmente es utilizada por varios búferes inseguros o in nio. En opinión del autor, parece estar directamente involucrada en cy reclamar la memoria por ti mismo , Autogestión, una herramienta poderosa para los grandes, Xiaobai (autor) ¡úsala con precaución!

La vida del objeto jvm

Cuando se ejecuta un nuevo comando, un objeto está a punto de crearse, veamos su vida.

1. Estructura del objeto: la estructura del objeto de Java se divide en: encabezado del objeto , datos de instancia y parte de relleno. El
encabezado del objeto se puede dividir en markWord, puntero del objeto y longitud de la matriz. El puntero del objeto apunta a qué clase es el objeto y la longitud de la matriz es el objeto. Si es una matriz, registre la longitud de la matriz. Si no es un objeto de matriz, no existe tal parte. El markWord es más complicado. Hay información de bloqueo, el valor hash del objeto, la edad de generación del objeto y otros
datos de instancia. Como su nombre lo indica, la información de su instancia El tamaño de la
parte completa del objeto Java es una regla, que es un múltiplo de 8 bytes. ¿Por qué existe esa regla? Es para facilitar la administración de la memoria (C también tiene una regla de alineación)

2. El nacimiento de un objeto: ¿Cómo aparece un objeto java? New es naturalmente un método muy simple, en el que la newInstance reflejada (Clase y Constructor) también creará el objeto, ambos de los cuales son la construcción de la clase utilizada Método. Además, usar el método de clonación y deserialización creará nuevos objetos, y no llamará al método de construcción.
Un objeto quiere nacer, por lo que debe haber una clase registrada, así que lo primero es ver qué clase eres. ? este proceso es comprobar verificado, echar un vistazo al método de la zona de la piscina constante, la celebración de un nuevo objeto literal de esta clase para encontrar usted no ha sido cargado, analizada, inicializado, si no, entonces necesitará clases de carga .
Si Si la clase se puede cargar correctamente y se completan el análisis y la inicialización, esta clase llamará al constructor para crear un nuevo objeto en el montón ~~
No cree que sea fácil crearlo, créelo en el montón. Un objeto no es una tarea fácil. En primer lugar, ¿dónde pones los nuevos objetos en el montón? Inteligente, dirías que está en el área del edén del montón. ¡Genial! Pero, ¿dónde está el área del edén? ¿Crees que soy solo un maestro, pero si asignas memoria para crear objetos en el jvm real, no es un problema a considerar? Hay dos formas de asignar memoria en jvm: la primera es la colisión de punteros , si el montón No hay fragmentación de memoria en la memoria. La memoria usada y la memoria no usada están en los dos extremos del área del eden respectivamente. En este momento, el medio está dividido para que el puntero se mueva hacia atrás según el tamaño del objeto. Esta asignación se llama colisión de puntero. ¿Qué pasa si hay fragmentación de memoria? Entonces, naturalmente, hay un segundo método de asignación: lista libre: Mantenga una lista (como un mapa de bits) para marcar qué memoria se usa y luego seleccione un espacio continuo sin usar adecuado para que lo use el montón. Esta es la lista libre. (El recolector de basura CMS tendrá fragmentación de memoria, PS (Y el serial no producirá fragmentación de la memoria)
Sin embargo, el montón es un espacio compartido por subprocesos, así que si este espacio es obtenido por dos subprocesos al mismo tiempo, ¿no será un problema? JVM tendrá cas al asignar memoria Operación para asegurar que no habrá problemas de concurrencia al momento de asignar memoria. Por supuesto, si es un objeto pequeño, habrá TLAB (ThreadLocalAlloactionBuffer, cada hilo asignará un pequeño espacio en el montón para ser privado al hilo para crear objetos para evitar problemas de concurrencia) .Después de configurar la información del encabezado del objeto del objeto y finalmente realizar la operación inicial del objeto, ¡nace tal objeto!

3. Acceso al objeto : finalmente nace un objeto. Para perros individuales en la pila, ¿cómo se contacta con este objeto? La especificación de JVM no estipula claramente cómo acceder al objeto. Ahora el acceso al objeto principal se divide en dos Especies: Hotspot utiliza punteros directos y, además de los punteros directos, también hay acceso a la piscina de control (consulte Baidu para obtener más detalles).

4. Reciclaje del objeto : ¿Quién puede sobrevivir en el mundo? Déjate ser magnífico y hermoso, y al final serás una calavera rosada; déjate ser una generación de arrogancia, sentada en miles de millas de ríos y montañas, al final, eventualmente se convertirá en un loess, y el objeto siempre será En el día de la recuperación, las seis reencarnaciones (YoungGC), la turbulencia del cielo y la tierra (FullGC).

Supervivencia en una situación desesperada : si no quieres morir, no puedes confiar solo en ti mismo. Si quieres estar en la pila durante mucho tiempo, debes tener un antepasado ( raíz gc ) en el que refugiarte para sobrevivir en una situación difícil. Entonces, ¿qué tipo de reino puede convertirse en este? ¿Qué pasa con los antepasados? Los
antepasados ​​son estos tipos : objetos de perros individuales en la pila ( referencias fuertes ), objetos referenciados por propiedades estáticas, objetos referenciados por propiedades estáticas en el área de método, objetos referenciados en Nativo. Estos objetos no son solo ellos mismos Indestructible, siempre que sea una línea (objetos relacionados), también es seguro . Hay ancestros reales y dioses falsos , que afirman proteger a una de las partes, ¡pero en realidad son mentirosos! Son referencias suaves, referencias débiles y virtuales en la pila. Las referencias , los objetos de aplicaciones suaves no le temen a youngGC, pero fullGC los matará. Las referencias débiles y las referencias virtuales no pueden resistir ni siquiera la GC completa. Son muy fuertes en el mundo exterior (las referencias suaves y las referencias débiles se usan a menudo en los marcos de almacenamiento en caché, y las referencias virtuales parecen ser inútiles) .

El desarrollo de JVM Heaven

Tao puede ser Tao, muy Tao; el nombre puede ser famoso, muy famoso. Sin nombre, el principio del cielo y la tierra, famosa, la madre de todas las cosas. Los cielos en el montón de jvm son los
tres mil mundos acumulados del recolector de basura . Cada mundo del montón tiene cielos tan ciertos. Usan todas las cosas como el perro para iniciar el caos del mundo, y el movimiento son seis reencarnaciones (YoungGC), e incluso el mundo es pesado. Plástico (FullGC) El camino del cielo es despiadado, pero hay rastros a seguir, veamos cuál es el camino del cielo.

La primera generación: Serie / Serie Antigua combinación de colección en serie, el Tiandao más antiguo ( recolector de basura ). Método de recolección de un solo subproceso y tamaño de gestión de espacio limitado, tiempo atroz de "Detener el mundo", el poder de la primera generación de Tiandao después de todo es un poco difícil conseguirlo Encienda el PARAMETRIZACIÓN. XX: + UseSerialGCInserte la descripción de la imagen aquí
elemento de segunda generación: serie de primero parNew / viejo elemento generación Tiandao ha estudiado el arte de Dongying avatar sombra, y, finalmente, puede multi-hilo de basura de reciclaje que es en realidad. multi-hilo de la primera generación de serie . Versión, cuando se usa CMS como recolector de basura, lo usará para recolectar la nueva generación de forma predeterminada. Debido a que es una recolección de múltiples subprocesos, la eficiencia de recolección es mejor que la generación original bajo la CPU de múltiples núcleos. Active el parámetro : -XX: UseParNewGC o cuando CMS esté encendido, también lo hará por defecto Use parNew para recolectar la nueva generación. Cuando el CMS tenga demasiada fragmentación de espacio, Serial Old comenzará a reciclar la
Inserte la descripción de la imagen aquí
generación anterior. Tres generaciones: combinación PS, ParallelScavenge (procesando la nueva generación) y ParallelOld (procesando la generación anterior), el recolector de basura usado por defecto en jdk1.8 , El pináculo del recolector de basura paralelo, el mecanismo de recolección de rendimiento primero, la estrategia de ajuste adaptativo de GC (el tamaño de la generación joven se establecerá dinámicamente de acuerdo con los parámetros establecidos para lograr los parámetros establecidos). ParallelScavenge proporciona un control preciso del tiempo de pausa y el rendimiento Los parámetros - XX: MaxGCPauseMillis , -XX: GCTimeRatio . ¿Qué puedo hacer si no tengo el ajuste de JVM? La estrategia de ajuste adaptativo de la combinación de PS lo llevará. ¿Cómo configurar ps? Se dice que está activado de forma predeterminada, ninguna configuración está bien ~~ Inserte la descripción de la imagen aquí
Cuatro generaciones: CMS (Concurrent Mark Sweep), una era paralela Eventualmente terminará. CMS es una existencia que hace época en el camino del cielo, y su nacimiento ha abierto la era de una gran concurrencia de recolectores de basura. ( Concurrencia: se refiere al reciclaje sin detener el mundo ), la combinación PS ha logrado un rendimiento. Extremo, CMS quiere salir adelante y debe encontrar otra manera. Ya que el rendimiento no puede hacerlo, vayamos por la concurrencia. CMS tuvo éxito, pero también falló. Abrió una era, pero no perfeccionó muchos defectos, y finalmente tuvo que help parNew / Serial Old ayúdalo a lidiar con el lío parámetros abiertos -XX :. + UseConcurMarkSweep
Inserte la descripción de la imagen aquí
Five head: Garbage-First (G1) , heredó el espíritu del CMS, el CMS implementó el pensamiento concurrente, logró abrir parámetros:! -XX: UseG1GC
Inserte la descripción de la imagen aquí

La era de la concurrencia de JVM

Para la recolección concurrente del recolector de basura, se necesita una comprensión más profunda. En una sección especial, aquí hablamos sobre los detalles de la recolección concurrente del CMS y el recolector de basura G1, así como algunos pozos y soluciones. Se utiliza el
algoritmo de limpieza de marcas El algoritmo de análisis de alcance (el algoritmo de análisis de alcance es un algoritmo utilizado por el recolector de basura en el jvm para determinar si un objeto es reciclable ) distingue qué objeto es reciclable y cuál no es reciclable, pero debido al algoritmo de barrido de marcas, siempre es después de que el tiempo de recuperación es el primero de todos los objetos, la bandera se convierte en 0, luego un buen marcador irrecuperable 1 , reciclable 0. como después de la recuperación, los objetos restantes se marcarán como 0 la próxima vez que marque 1 Claro . Debido a este algoritmo, el 0 y 1 del bit de bandera en diferentes períodos tienen significados diferentes. Si es un modo de recolección concurrente, ¿el bit de bandera del objeto recién generado es 0 o 1? Si es 0, en este momento Si finaliza el estado marcado y comienza a reciclar, el nuevo objeto debe reciclarse, pero si es 1, en caso de que no esté configurado en 0, la próxima vez que el objeto sea reciclado. Pero debido a que la inicial es 1, debe reciclarse No se reciclará. El
recolector de basura quiere abrir la era de la gran concurrencia, y el algoritmo de eliminación de marcas no puede satisfacer sus necesidades. Entonces debe encontrar una manera, luego necesita tener un algoritmo para reemplazar el algoritmo de eliminación de marcas original. !
suplemento Importante: la alta eficiencia del algoritmo de análisis de la accesibilidad en Java se basa en la estructura de datos de oopMap ahorrar donde se almacenan las referencias a objetos, y el mantenimiento de oopMap es en el momento de instrucciones específicas, que las instrucciones? llamada al método , Salto de bucle, salto de excepción, estas instrucciones mantendrán oopMap, y estas instrucciones son puntos seguros(La elección del punto de seguridad es si tiene las características de permitir que el programa se ejecute durante mucho tiempo, por lo que la característica más obvia es la multiplexación de la secuencia de instrucciones, por lo que las llamadas a métodos, los saltos de bucle y los saltos de excepción son tales puntos)
El método de marcado de tres colores de la base de los algoritmos concurrentes : La aparición del algoritmo de marcado de tres colores brinda la posibilidad de marcar la basura para la concurrencia. Los tres colores son: negro, gris y blanco
. La correlación directa a continuación significa que hay una asociación con el objeto b en el objeto, por ejemplo: el objeto a tiene un atributo Si es un tipo B de b, entonces b está directamente relacionado con a.
Negro : en sí mismo no se puede reciclar, y los objetos directamente relacionados con él no tienen un objeto blanco (los objetos directamente relacionados con él son negros o blancos).
Gris : en sí mismo no se puede reciclar, Pero los objetos directamente relacionados con él son
objetos blancos.Blanco : objetos que no han sido analizados (tal vez objetos reciclables o no
analizados no reciclables) dando vueltas mucho, aquí hay una explicación: los llamados tres El método de marcado de color es una optimización del algoritmo de eliminación de marcas. Dado que el algoritmo de eliminación de marcas no puede ser simultáneo porque solo hay dos estados, entonces me involucraré en tres estados. Más tarde, mientras ejecuto otros hilos comerciales, marcaré los objetos reciclables. El proceso de notación de color es así. Primero, tome tres cosas que se pueden grabar (montón, pila, libro, caja, etc.), una se llama objeto negro de grabación especial, un objeto gris de grabación especial y un objeto blanco de grabación especial . la primera fase de la gcroot se enteran, montón continuación, gris (heap si se usa) en el interior del gcroot en ellos, la segunda etapa consiste en el montón de color gris en el interior del objeto en un montón en el interior negro, cómo decirlo? el Los objetos grises se sacan uno por uno, y los objetos directamente relacionados con él se encuentran y se agregan a la pila gris. Luego los objetos grises pueden ir a la pila negra. Repita este proceso hasta que la pila gris esté vacía. El marcado está completo.
Tanto en CMS como en G1 se utiliza la notación de tres colores. CMS y G1 tienen puntos comunes al recoger, la marca inicial y la marca común . El autor cree que esto corresponde a la primera y segunda etapa de la notación de tres colores. Etapa **. La etapa de calificación inicial es "detener el mundo" **, pero creo que la existencia de oopMap es muy rápida en esta etapa, ¿por qué? Cómo decir esto, mire la explicación profesional (extracto de < <Comprensión profunda de la máquina virtual Java >>)
Tomado de un conocimiento profundo de la máquina virtual Java

La notación de tres colores se utiliza en el recolector de basura concurrente, en condiciones de concurrente, debe producirse un nuevo objeto , los objetos reciclables se convierten en objetos no reciclables , es necesario resolver el problema de
CMS en por La generación de nuevos objetos tiene un proceso de re-marcado , el cual también producirá "stop the world", este proceso también es muy rápido (comparado con el marcado inicial es lento), este proceso consiste en generar nuevos objetos al nuevo Márcalo bien y evita que sea reciclado. El problema de que los objetos no reciclables se conviertan en objetos reciclables también se puede resolver en este momento. Si
G1 tiene una nota final , el procesamiento parece ser similar al remarcado de CMS. , Pero es esencialmente diferente. Por la razón del algoritmo, la calificación final de G1 es muy rápida.
CMS no será stw durante el marcado y la limpieza concurrentes . Luego, en la fase de limpieza concurrente , los objetos incobrables se vuelven Los objetos reciclables de se convertirán en basura flotante y no serán reciclados en esta recolección de basura, sin embargo, G1 solo tiene la etapa de marcado concurrente y no stw, por lo que no hay problema de basura flotante.

La notación de tres colores en sí tiene otro problema que debe resolverse, es decir, todos los objetos
escaneados por el hilo 1 han ingresado al montón negro, por lo que ya no se escanearán (solo se escanearán los objetos grises). El hilo de tiempo 2 está escaneando el objeto gris B, y el objeto gris B tiene un objeto directamente asociado C. Aunque el objeto C es un objeto blanco incierto, en realidad es un objeto irrecuperable que no ha sido escaneado.

Inserte la descripción de la imagen aquí
Si en este momento, la relación de referencia entre el objeto B y el objeto A en el subproceso comercial desaparece, pero el objeto C no se vuelve reciclable de esta manera, pero el objeto A hace referencia a él. Pero A es negro y ya no será Después de escanear, el
Inserte la descripción de la imagen aquí
objeto B se vuelve negro después de escanear, y se inicia la recuperación. El objeto A se recuperará porque no es negro, y debería ser irrecuperable. Esta es la desaparición del objeto (etiqueta faltante)
Inserte la descripción de la imagen aquí
CMS y G1 han resuelto la desaparición del objeto CMS usa el algoritmo de actualización incremental (Actualización incremental), y G1 se resuelve con el algoritmo de instantánea inicial . No discutiré estos dos algoritmos en profundidad. Este blog hablará aproximadamente sobre la idea:
actualización incremental : Cuando el objeto C se inserta en el objeto A, convierta el objeto A en gris, y luego, al volver a marcar, stw escanea el objeto A nuevamente para
iniciar la instantánea : mantenga la instantánea en la fase de marcado concurrente para resolver el problema (el autor también está actualmente Todavía en estudio)

Nudo

Para la comparación entre CMS y G1, este blog es solo una muestra desde el punto de vista de los algoritmos concurrentes. Tienen muchos lugares diferentes. Sin embargo, el autor tiene conocimientos limitados en esta etapa, y quiero profundizar más, y tengo energía más que suficiente, pero no suficiente, y es posible que mejore en el futuro. , En el resumen final, hable sobre algunas deficiencias de CMS y G1
CMS: cpu es sensible , solo múltiples cpus pueden jugar bien. La basura flotante , no resuelve el problema de la basura flotante. La fragmentación de la memoria , el algoritmo de barrido de marcas generará fragmentación de espacio.
G1 : la CPU es sensible , como arriba, requiere mucha memoria .

Algunos conceptos que el autor debe comprender en profundidad: los detalles de implementación del recolector de basura G1, los detalles de la memoria, la implementación específica del algoritmo de instantánea inicial y el conjunto de memoria utilizado por la referencia de generación cruzada de G1

Tardaron 3 días en terminar finalmente la escritura, el fin es esparcir flores, la palabra clave no es fácil,
es muy importante prestar atención a los tres enlaces : acabo de empezar a aprender JVM de forma sistemática, y es inevitable que haya algunos problemas de comprensión. Espero que todos señalen que el autor debe revisar cuidadosamente la información y corregirla. .

Supongo que te gusta

Origin blog.csdn.net/weixin_41046569/article/details/109778911
Recomendado
Clasificación