Resumen de preguntas de entrevista jvm muy clásicas.

09b374a365f24cfea5ef686ab49cef8f.jpeg


 

 

01 Cuéntame sobre los componentes principales de la JVM y sus funciones.

 

JVM incluye dos subsistemas y dos componentes, los dos subsistemas son cargador de clases (carga de clases), motor de ejecución (motor de ejecución); los dos componentes son área de datos de tiempo de ejecución (área de datos de tiempo de ejecución), interfaz nativa (interfaz local). Cargador de clases (carga de clases): de acuerdo con el nombre de clase completo dado (p. ej., java.lang.Object) para cargar el archivo de clase en el área de método en el área de datos de tiempo de ejecución. Motor de ejecución: Ejecuta instrucciones en clases. Native Interface (interfaz local): Interactúa con bibliotecas nativas y es una interfaz para que otros lenguajes de programación interactúen. Runtime data area (área de datos de tiempo de ejecución): Esto es lo que solemos llamar la memoria de la JVM. Función: Primero, el compilador convierte el código Java en código de bytes, y luego el cargador de clases (ClassLoader) carga el código de bytes en la memoria y lo coloca en el área de método del área de datos de tiempo de ejecución (área de datos de tiempo de ejecución). El archivo de código de bytes es solo un conjunto de especificaciones del conjunto de instrucciones para la JVM y no se puede entregar directamente al sistema operativo subyacente para su ejecución. Por lo tanto, se requiere un motor de ejecución de analizador de comandos específico (Motor de ejecución) para traducir el código de bytes en las instrucciones del sistema subyacente, y luego entréguelos a la CPU para su ejecución. En este proceso, es necesario llamar a otros idiomas. La interfaz de la biblioteca local (interfaz nativa) para realizar la función de todo el programa.

 

02 Hable sobre el área de datos de tiempo de ejecución de JVM

 

Durante la ejecución de un programa Java, la máquina virtual Java divide el área de memoria que administra en varias áreas de datos diferentes. Estas áreas tienen sus propios propósitos, así como el tiempo de creación y destrucción.Algunas áreas existen con el inicio del proceso de la máquina virtual, y algunas áreas se establecen y destruyen según el inicio y el final del hilo. La memoria gestionada por la máquina virtual Java se divide en las siguientes áreas:

Registro de contador de programa: El indicador de número de línea del código de bytes ejecutado por el subproceso actual. El trabajo del analizador de código de bytes es cambiar el valor de este contador para seleccionar la siguiente instrucción de código de bytes que se ejecutará. Las funciones básicas como bifurcación, bucle, salto, manejo de excepciones y recuperación de subprocesos necesitan depender de este contador para completarse;

Pilas de máquinas virtuales de Java (pilas de máquinas virtuales de Java): se utilizan para almacenar información como tablas de variables locales, pilas de operandos, enlaces dinámicos y salidas de métodos;

Pila de métodos nativos: tiene la misma función que la pila de máquinas virtuales, excepto que la pila de máquinas virtuales sirve al método Java, mientras que la pila de métodos nativos sirve para que la máquina virtual llame al método nativo;

Montón de Java (Java Heap): la parte más grande de memoria en la máquina virtual de Java es compartida por todos los subprocesos, y casi todas las instancias de objetos asignan memoria aquí;

Área de método (área de método): se utiliza para almacenar datos como información de clase, constantes, variables estáticas y código compilado justo a tiempo que ha cargado la máquina virtual.

 

03 Copia profunda y copia superficial

 

La copia superficial (shallowCopy) solo agrega un puntero a la dirección de memoria existente. La copia profunda (deepCopy) agrega un puntero y solicita una nueva memoria, de modo que el puntero agregado apunte a la nueva memoria. En el caso de la copia profunda, la memoria no se liberará debido al error de liberar la misma memoria durante la copia superficial. Copia superficial: solo apunta a la dirección de memoria copiada. Si la dirección original cambia, el objeto copiado superficial también cambiará en consecuencia. Copia profunda: abra una nueva dirección de memoria en la computadora para almacenar el objeto copiado.

 

04 Describa brevemente el mecanismo de recolección de basura de Java

 

En java, el programador no necesita liberar explícitamente la memoria de un objeto, sino que la máquina virtual lo ejecuta por sí misma. En la JVM, hay un subproceso de recolección de basura, que es de baja prioridad y no se ejecutará en circunstancias normales. Solo cuando la máquina virtual esté inactiva o la memoria del montón actual sea insuficiente, se activará la ejecución para escanear aquellos objetos que no están referenciados por ninguno y agregarlos a la colección para reciclarlos.

 

05 ¿Qué es GC? ¿Por qué GC?

 

GC significa recolección de basura (Gabage Collection). El manejo de la memoria es donde los programadores son propensos a tener problemas. La recuperación de memoria olvidada o incorrecta conducirá a la inestabilidad del programa o del sistema o incluso fallará. La función GC proporcionada por Java puede monitorear automáticamente si el objeto excede el alcance para lograr el propósito de la recuperación automática de la memoria. El lenguaje Java no proporciona un método de operación explícito para liberar la memoria asignada.

 

06 ¿Cuáles son los tipos de referencia en Java?

 

Referencia fuerte: no se reciclará cuando ocurra GC. 

Referencias blandas: objetos que son útiles pero no necesarios y se reciclarán antes de que se produzca un desbordamiento de la memoria. 

Referencias débiles: los objetos que son útiles pero no necesarios se reciclarán en la próxima GC.

Referencia fantasma (referencia fantasma/referencia fantasma): Los objetos no se pueden obtener a través de referencias fantasma. PhantomReference se utiliza para implementar referencias fantasma. El propósito de las referencias fantasma es devolver una notificación durante gc.

 

07 ¿Cómo juzgar si el objeto se puede reciclar?

 

Cuando el recolector de elementos no utilizados realiza la recolección de elementos no utilizados, lo primero que se debe determinar es qué memoria se debe recuperar, qué objetos son de "supervivencia" y no se pueden recuperar, qué objetos están "muertos" y se deben recuperar. En general, hay dos formas de juzgar:

Método de contador de referencia: cree un recuento de referencia para cada objeto. Cuando hay una referencia de objeto, el contador es +1, y cuando se libera la referencia, el recuento es -1. Cuando el contador es 0, se puede reciclar. Tiene la desventaja de que no puede resolver el problema de las referencias circulares;

Algoritmo de análisis de accesibilidad: a partir de GC Roots para buscar hacia abajo, la ruta recorrida por la búsqueda se denomina cadena de referencia. Cuando un objeto no tiene ninguna cadena de referencia conectada a GC Roots, prueba que el objeto se puede reciclar.

 

08 Dime, ¿qué algoritmos de recolección de basura tiene la JVM?

 

Algoritmo de barrido de marcas: marca objetos inútiles y luego límpialos y recíclalos. Desventajas: Ineficiente, incapaz de eliminar los escombros. 

Algoritmo de copia: divida dos áreas de memoria de igual tamaño según la capacidad, copie el objeto vivo en otro bloque cuando se agote un bloque y luego limpie el espacio de memoria usado a la vez. Desventajas: El uso de memoria no es alto, solo la mitad del original.

Algoritmo de clasificación de marcas: marque objetos inútiles, deje que todos los objetos sobrevivientes se muevan hacia un extremo y luego borre directamente la memoria fuera del límite final.

Algoritmo de generación: divida la memoria en varias partes según el ciclo de vida del objeto, generalmente la nueva generación y la generación anterior. La nueva generación básicamente adopta el algoritmo de copia, y la generación anterior usa el algoritmo de clasificación de marcas.

 

09 Dime que tipo de recolectores de basura tiene la JVM?

 

Si el algoritmo de recolección de elementos no utilizados es la metodología de recuperación de la memoria, entonces el recolector de elementos no utilizados es la implementación específica de la recuperación de la memoria. La siguiente figura muestra 7 recopiladores que actúan en diferentes generaciones. Los recopiladores utilizados para reciclar la nueva generación incluyen Serial, PraNew y Parallel Scavenge, y los recopiladores utilizados para reciclar la generación anterior incluyen Serial Old, Parallel Old y CMS. También hay un recopilador G1 utilizado para reciclar todo el montón de Java. Las líneas entre diferentes colectores indican que se pueden usar juntos. img Colector serial (algoritmo de replicación): colector de subproceso único de nueva generación, marcado y borrado son de subproceso único, la ventaja es simple y eficiente; Colector ParNew (algoritmo de replicación): colector paralelo de nueva generación, en realidad una versión de subprocesos múltiples del colector Serial, que tiene un mejor rendimiento que Serial en un entorno de CPU de varios núcleos; Colector de barrido paralelo (algoritmo de replicación): colector paralelo de nueva generación, que busca un alto rendimiento y un uso eficiente de la CPU. Rendimiento = tiempo de subproceso de usuario/(tiempo de subproceso de usuario + tiempo de subproceso de GC), el alto rendimiento puede usar eficientemente el tiempo de CPU y completar las tareas de cálculo del programa lo antes posible, adecuado para aplicaciones en segundo plano y otros escenarios que no requieren alta interacción; Recopilador antiguo en serie (algoritmo de clasificación de marcas): Recopilador de un solo subproceso de generación anterior, la versión anterior del recopilador en serie; Recopilador antiguo paralelo (algoritmo de clasificación de marcado): Recopilador paralelo de generación anterior, prioridad de rendimiento, Recopilador de barrido paralelo Versión de generación anterior; CMS (concurrente) Mark Sweep) colector (algoritmo de barrido de marcas): el colector paralelo de la generación anterior tiene como objetivo obtener el tiempo de pausa de recuperación más corto. Tiene las características de alta concurrencia y pausa baja, y persigue el tiempo de pausa de recuperación más corto del GC. Colector G1 (Garbage First) (algoritmo mark-sort): Colector paralelo de heap de Java, el colector G1 es un nuevo colector proporcionado por JDK1.7, el colector G1 se basa en el algoritmo "mark-sort", es decir, no generará fragmentación de memoria. Además, una característica importante del recopilador G1 que es diferente de los recopiladores anteriores es que el alcance del reciclaje G1 es todo el montón de Java (incluidas la nueva generación y la generación anterior), mientras que el alcance de los primeros seis recopiladores se limita a la nueva generación o la generación anterior.

 

10 Recolector de Basura de Generación Joven y Recolector de Basura de Vieja Generación

 

Recopiladores de generación joven: Serial, ParNew, Parallel Scavenge Recopiladores de generación anterior: Serial Old, Parallel Old, recopiladores de pila completa CMS.

El recolector de basura de nueva generación G1 generalmente usa el algoritmo de copia. La ventaja del algoritmo de copia es la alta eficiencia, pero la desventaja es la baja utilización de la memoria; el recolector de la generación anterior generalmente usa el algoritmo de clasificación de marcas para la recolección de basura.

 

11 Describir el mecanismo principal de JVM cargando archivos de Clase

 

Todas las clases en Java deben cargarse en la JVM mediante un cargador de clases para poder ejecutarse. El cargador de clases en sí también es una clase, y su trabajo es leer el archivo de clase del disco duro a la memoria. Cuando escribimos programas, apenas debemos preocuparnos por la carga de clases, porque estos se cargan implícitamente, a menos que tengamos un uso especial, como la reflexión, necesitamos cargar explícitamente las clases requeridas. Hay dos formas de carga de clases: 1. Carga implícita. Cuando el programa encuentra un objeto generado por new, etc. durante el proceso de ejecución, se llama implícitamente al cargador de clases para cargar la clase correspondiente en el jvm. 2. Carga explícita. A través de métodos como class.load. Esto es, por supuesto, para ahorrar sobrecarga de memoria.

 

12 ¿Qué es un cargador de clases y qué son los cargadores de clases?

 

El bloque de código que realiza la obtención del flujo de bytes binarios de la clase a través del nombre de la autoridad de la clase se denomina cargador de clases. Hay principalmente cuatro cargadores de clases:

1. El Bootstrap ClassLoader se utiliza para cargar la biblioteca de clases principales de Java y no puede ser referenciado directamente por el programa Java.

2. Cargador de clases de extensiones (extensions class loader): se utiliza para cargar la biblioteca de extensiones de Java. Las implementaciones de Java Virtual Machine proporcionan un directorio de biblioteca de extensión. El cargador de clases busca en este directorio y carga las clases de Java. 

3. System class loader (cargador de clases del sistema): Carga clases de Java de acuerdo con la ruta de clase (CLASSPATH) de la aplicación Java. En términos generales, las clases de aplicaciones Java son cargadas por él. Se puede obtener a través de ClassLoader.getSystemClassLoader(). 

4. El cargador de clases definido por el usuario se implementa al heredar la clase java.lang.ClassLoader.

 

13 Cuénteme sobre el proceso de ejecución de la carga de clases.

 

La carga de clases se divide en los siguientes 5 pasos: 

Cargando: busque el archivo de clase correspondiente según la ruta de búsqueda e impórtelo;

Verificación: compruebe la corrección del archivo de clase cargado; 

Preparación: asigne espacio de memoria para variables estáticas en la clase;

Resolución: la máquina virtual reemplaza las referencias simbólicas en el grupo constante con referencias directas. Una referencia simbólica se entiende como una marca, y una referencia directa apunta directamente a una dirección en la memoria; 

Inicialización: realice el trabajo de inicialización en variables estáticas y bloques de código estático.

 

14 ¿Qué es el modelo de delegación de padres?

 

Modelo de delegación parental: si un cargador de clases recibe una solicitud de carga de clases, no cargará la clase primero, sino que delegará la solicitud al cargador de clases principal para que la complete. El cargador de clases de cada capa es el mismo, por lo que todas las solicitudes de carga se enviarán al cargador de clases de inicio de nivel superior. Solo cuando el cargador principal no puede completar la solicitud de carga (la clase requerida no se encuentra en su ámbito de búsqueda), el cargador secundario intentará cargar la clase. Cuando una clase recibe una solicitud de carga de clase, no cargará la clase por sí misma primero, sino que la delegará a la clase principal, y la clase principal la cargará. Si la clase principal no se puede cargar en este momento, se retroalimentará a la subclase, y la subclase completará la carga de la clase.

 

Eso es todo por compartir hoy, ¡gracias por darle me gusta, recopilar y reenviar!

Supongo que te gusta

Origin blog.csdn.net/Rocky006/article/details/131823346
Recomendado
Clasificación