Alguien finalmente dejó en claro qué es la sincronización JVM, ¡y me beneficié mucho!

El modelo de memoria de JVM y el mecanismo de recolección de basura de JVM siempre han sido temas que los profesionales de la industria de Java no pueden evitar (ajuste real, entrevista) Aprendamos sobre el mecanismo de recolección de basura de JVM. Como practicante de Java, si no domina estos puntos de conocimiento, puede ser difícil saltarse la etapa de avanzado a arquitecto.
Inserte la descripción de la imagen aquí

¿Cómo entiende la sincronización?
Respuesta: La sincronización se utiliza para controlar el acceso a los recursos compartidos entre varios subprocesos para garantizar que solo un subproceso pueda acceder a este recurso al mismo tiempo. En un programa multiproceso protegido asincrónicamente, cuando un subproceso está modificando una variable compartida, otro subproceso también puede estar usando o actualizando su valor. La sincronización evita la generación de datos sucios.

Sincronizar el método:

public synchronized void Method1 () {
    
    
// Appropriate method-related code.
}

Sincronice el bloque de código dentro del método:

public myFunction (){
    
    
    synchronized (this) {
    
    
            // Synchronized code here.
         }
}

Sun HotSpot VM es una máquina virtual que viene con JDK y Open JDK, y actualmente es la máquina virtual Java más utilizada.

Distribución de memoria JVM

Contador de programa: Es un espacio de memoria pequeño y puede considerarse como un indicador de número de línea del código de bytes ejecutado por el hilo actual. Las funciones básicas como ramas, bucles, saltos, manejo de excepciones y recuperación de subprocesos en el programa deben depender de este contador para completarse. Dado que el subproceso múltiple se realiza por la forma en que los subprocesos alternan y asignan el tiempo de ejecución del procesador, esta área es la memoria privada de subprocesos.
Pila de máquina virtual: describe el modelo de memoria de ejecución del método Java, que se utiliza para almacenar tablas de variables locales, pilas de operandos, enlaces dinámicos, salidas de métodos y otros
montones: es la parte más grande de memoria administrada por la máquina virtual Java. El montón de Java es Un área de memoria compartida por todos los subprocesos. Se crea cuando la máquina virtual comienza a almacenar todas las instancias. También es el
área de método principal para la gestión del recolector de basura : se utiliza para almacenar la información de clases, constantes, variables estáticas y compilación instantánea que ha sido cargada por la máquina virtual. Código y otros datos. HotSVM también realiza GC para esta área, principalmente recuperación constante y clase.

Estrategia de asignación de memoria de JVM
La asignación de memoria de objetos, en la dirección general, se asigna en el montón de Java.
En la mayoría de los casos, los objetos se asignan en el área Edén de la generación joven. Cuando el área del Edén no tiene suficiente espacio para la asignación, la máquina virtual iniciará un GC menor.
En la mayoría de los casos, los objetos grandes ingresan directamente a la vejez y la máquina virtual proporciona parámetros para definir el umbral del objeto grande.Los objetos que exceden el umbral ingresarán directamente a la vejez.
Los objetos que sobreviven a múltiples GC menores (objetos supervivientes a largo plazo) entrarán en la vejez. La máquina virtual proporciona parámetros para establecer umbrales.

Algoritmo de recolección de basura JVM Algoritmo
de barrido de marcas: primero marque todos los objetos que necesiten ser reciclados y recoja todos los objetos marcados de manera uniforme después de marcarlos.
Copiar algoritmo: Divida la memoria disponible en dos partes de igual tamaño según la capacidad y use solo una de ellas a la vez. Cuando se agota una parte de la memoria, se guardará otra y el espacio de memoria utilizado se limpiará de inmediato.
Algoritmo de clasificación de marcado: el proceso de marcado es el mismo que el algoritmo de "limpieza de marcado", pero los pasos siguientes no son para limpiar directamente los objetos reciclables, sino para mover un extremo y luego limpiar directamente la memoria fuera del límite del extremo.
Algoritmo de recopilación generacional: Generalmente, el montón de Java se divide en la nueva generación y la generación anterior, y se adopta el algoritmo de recopilación más adecuado según las características de cada generación. La nueva generación ha descubierto que ha muerto una gran cantidad de objetos y se elige el algoritmo de replicación. En la vejez, debido a la alta tasa de supervivencia de los objetos, se debe utilizar el algoritmo "marcar-limpiar" o "marcar-ordenar" para el reciclaje.

Garbage Collector
Serial Collector: Es un recolector de un solo subproceso que solo usa una CPU o un subproceso de recolección para completar el trabajo de recolección de basura. Durante la recolección de basura, todos los demás subprocesos de trabajo deben suspenderse hasta que finalice la recolección.
Recolector ParNew: Es una versión multiproceso del recolector Serial. Excepto por el uso de múltiples subprocesos para la recolección de basura, los otros comportamientos son exactamente los mismos que los del recolector serial.
Colector CMS: Es un colector que tiene como objetivo obtener el menor tiempo de pausa de recuperación. El proceso se divide en los siguientes cuatro pasos:
marcado inicial,
marcado simultáneo,
remarcado,
eliminación simultánea

Parámetros de inicio comunes de JVM
-Xms / -Xmx-el tamaño inicial del montón / el tamaño máximo del
montón
-Xmn- el tamaño de la generación joven en el montón -XX: -DisableExplicitGC-let System.gc () no tiene ningún efecto
-XX: + PrintGCDetails- Imprima los detalles de GC-
XX: + PrintGCDateStamps - Imprima la marca de tiempo de la operación de GC-
XX: NewSize / XX: MaxNewSize - Establezca el tamaño de la generación joven / tamaño máximo de la generación joven-
XX: NewRatio - Puede establecer la proporción de las generaciones mayores y jóvenes-
XX : PrintTenuringDistribution: establecido después de cada distribución de salida de GC de nueva generación en la edad objetivo de los sobrevivientes Paradise
-XX: InitialTenuringThreshold / -XX: MaxTenuringThreshold: establece el valor inicial del año anterior y el umbral máximo
-XX: TargetSurvivorRatio: establece la zona objetivo de supervivencia Tasa de uso

Ciclo de vida de la clase JAVA La
clase Java comienza desde que se carga en la memoria de la máquina virtual hasta que se descarga de la memoria, todo su ciclo de vida incluye siete etapas: carga, verificación, preparación, análisis, inicialización, uso y descarga.

Carga de clases JVM
Cargador de clases Bootstrap: Es un cargador de clases implementado con código nativo, que es responsable de cargar las bibliotecas de clases en <Java_Runtime_Home> / lib en la memoria (como rt.jar). Dado que el cargador de clases de arranque incluye los detalles de la implementación local de la máquina virtual, los desarrolladores no pueden obtener directamente una referencia al cargador de clases de arranque, por lo que no se permiten operaciones directas por referencia.
Cargador de clases de extensión estándar (Extensión): se implementa mediante ExtClassLoader de Sun (sun.misc.Launcher $ ExtClassLoader) que la biblioteca de clases en la ubicación especificada por Java_Runtime_Home> /lib/extjava.ext.dir se carga en la memoria. Los desarrolladores pueden usar directamente el cargador de clases extendido estándar.

Cargador de clases del sistema: es implementado por AppClassLoader de Sun (sun.misc.Launcher $ AppClassLoader). La biblioteca de clases especificada en CLASSPATH se carga en la memoria. Los desarrolladores pueden usar directamente la clase del sistema más el
mecanismo de delegación principal para describir: cuando un cargador de clases en particular recibe una solicitud para cargar una clase, primero delega la tarea de carga al cargador de clases principal, de forma recursiva, si el cargador de clases principal puede completar La tarea de carga de clases regresará con éxito; solo cuando el cargador de clases padre no pueda completar la tarea de carga, se cargará solo.

Ajuste de JVM
Ver asignación de espacio de almacenamiento dinámico (generación joven, generación anterior, asignación de generación persistente)
Monitoreo de recolección de basura (monitoreo a largo plazo de la situación de recolección)
Monitoreo de información de subprocesos: el número de subprocesos del sistema
Monitoreo del estado de subprocesos: en qué estado se encuentra cada subproceso
Detalles del siguiente hilo: verifique el estado de ejecución interno del hilo, punto muerto, verifique
los puntos calientes de la CPU: verifique qué métodos del sistema ocupan mucho tiempo de la CPU
Puntos calientes de la memoria: verifique qué objetos tienen el mayor número en el sistema

Sin relación

Debido a demasiada información, este artículo tiene un espacio limitado y solo comparte una pequeña parte de la información. Si necesita un conjunto completo de preguntas de la entrevista real (incluidas las respuestas a todas las preguntas), haga clic aquí. Código: qf
Recientemente, es el mejor momento para encontrar un trabajo. ¡Todos encuentran su trabajo favorito sin problemas!
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/w1103576/article/details/108694439
Recomendado
Clasificación