Entrevista de investigación y desarrollo de Java de Alibaba 99 preguntas (incluidas las respuestas): JVM + Spring + MySQL + grupo de subprocesos + bloqueo

Estructura de la memoria JVM

De acuerdo con la especificación de JVM, la memoria de JVM se divide en cinco partes: pila de máquina virtual, montón, área de método, contador de programa y pila de método local.

1. Pila de máquina virtual Java: hilo privado; cuando se ejecuta cada método, se crea un marco de pila, almacenando la tabla de variables locales, la pila de operandos, la conexión dinámica, la dirección de retorno del método, etc. ejecución, Corresponde a empujar y hacer estallar un marco de pila en la pila de la máquina virtual.

2. Montón: compartido por subprocesos, un área de memoria compartida por todos los subprocesos, creada cuando se inicia la máquina virtual y utilizada para almacenar instancias de objetos.

3. Área de métodos: intercambio de subprocesos, un área de memoria compartida por todos los subprocesos, utilizada para almacenar información de clase, constantes, variables estáticas, etc.que han sido cargadas por la máquina virtual.

4. Contador de programa: hilo privado, es el indicador de número de línea del bytecode ejecutado por el hilo actual. Cada hilo debe tener un contador de programa independiente. Este tipo de memoria también se denomina memoria "hilo privado".

5. Pila de métodos nativos: hilo privado, principalmente sirve al método nativo utilizado por la máquina virtual.

Entrevista de I + D de ByteDance Java 99 preguntas (incluidas las respuestas): JVM + Spring + MySQL + Thread Pool + Lock

 

Por que usar el grupo de subprocesos

Entonces primero debemos entender qué es un grupo de subprocesos

El grupo de subprocesos se refiere a la creación de una colección de subprocesos en el proceso de inicialización de una aplicación de subprocesos múltiples y luego reutilizar estos subprocesos cuando es necesario realizar nuevas tareas en lugar de crear un nuevo subproceso.

Beneficios de usar el grupo de subprocesos

  1. El grupo de subprocesos mejora el tiempo de respuesta de una aplicación. Debido a que los subprocesos en el grupo de subprocesos están listos y esperando que se les asignen tareas, la aplicación puede usarlos directamente sin crear un nuevo subproceso.
  2. El grupo de subprocesos le ahorra al CLR la sobrecarga de crear un subproceso completo para cada tarea de corta duración y puede reclamar recursos una vez finalizada la tarea.
  3. El grupo de subprocesos optimiza los intervalos de tiempo de los subprocesos en función de los procesos que se ejecutan actualmente en el sistema.
  4. El grupo de subprocesos nos permite iniciar múltiples tareas sin establecer atributos para cada subproceso.
  5. El grupo de subprocesos nos permite pasar una referencia de objeto que contiene información de estado para los parámetros del programa de la tarea que se está ejecutando.
  6. El grupo de subprocesos se puede utilizar para resolver la limitación del número máximo de subprocesos para procesar una solicitud específica.

Entrevista de I + D de ByteDance Java 99 preguntas (incluidas las respuestas): JVM + Spring + MySQL + Thread Pool + Lock

 

experiencia de optimización de msyql

1. Para optimizar la consulta, evite los escaneos completos de la tabla tanto como sea posible, y primero considere establecer índices en las columnas involucradas en dónde y ordenar por.

2. Trate de evitar usar el operador! = O <> en la cláusula where, de lo contrario, el motor dejará de usar el índice y realizará un escaneo completo de la tabla.

3. Utilice campos numéricos tanto como sea posible. Si los campos que solo contienen información numérica, trate de no diseñarlos como tipos de caracteres, esto reducirá el rendimiento de consultas y conexiones y aumentará la sobrecarga de almacenamiento. Esto se debe a que el motor compara cada carácter de la cadena uno por uno al procesar consultas y concatenaciones. Para los tipos numéricos, solo una comparación es suficiente.

4. No use select * from t en ningún lugar, reemplace "*" con una lista de campos específica y no devuelva ningún campo no utilizado.

5. Evite la creación y eliminación frecuentes de tablas temporales para reducir el consumo de recursos de la tabla del sistema. Y así sucesivamente, espera y así sucesivamente ...

¿Qué es el interbloqueo de subprocesos? ¿Cómo ocurre el interbloqueo? ¿Cómo evitar el bloqueo del hilo?

Introducción al interbloqueo:

El interbloqueo de subprocesos se refiere al hecho de que dos o más subprocesos retienen los recursos de cada uno, lo que hace que estos subprocesos estén en un estado de espera y no puedan continuar con la ejecución. Cuando un subproceso ingresa al bloque de código sincronizado del objeto, ocupa el recurso. No libera el recurso hasta que sale del bloque de código o llama al método de espera. Durante este período, otros subprocesos no pueden ingresar al bloque de código. Cuando los subprocesos retienen los recursos necesarios entre sí, esperarán a que los demás liberen los recursos. Si los subprocesos no liberan activamente los recursos que ocupan, se producirá un punto muerto.

Algunas condiciones específicas para la aparición de interbloqueo:

  1. Condiciones mutuamente excluyentes: el proceso es exclusivo de los recursos asignados, es decir, un recurso solo puede ser ocupado por un proceso hasta que sea liberado por el proceso.
  2. Condiciones de solicitud y retención: cuando un proceso se bloquea debido a una solicitud de recursos ocupados, conserva los recursos adquiridos.
  3. Condiciones de no privación: antes de que el proceso libere un recurso, ningún otro proceso puede privarlo.
  4. Condición de espera de bucle: cuando se produce un interbloqueo, el proceso de espera debe formar un bucle (similar a un bucle infinito), provocando un bloqueo permanente.

Como evitar:

1. Secuencia de bloqueo: cuando varios subprocesos necesitan los mismos bloqueos, pero los bloqueos se bloquean en diferentes órdenes, es probable que se produzcan interbloqueos. Si puede asegurarse de que todos los subprocesos adquieran bloqueos en el mismo orden, no se producirán interbloqueos. Por supuesto, este método requiere que conozcas de antemano todas las cerraduras que se pueden usar, pero a veces es impredecible.

2. Límite de tiempo de bloqueo: más un período de tiempo de espera, si un hilo no obtiene con éxito todos los bloqueos requeridos dentro del límite de tiempo dado, retrocederá y liberará todos los bloqueos adquiridos, y luego esperará un período de tiempo aleatorio antes de reiniciar .prueba. Pero si hay muchos subprocesos que compiten por el mismo lote de recursos al mismo tiempo, incluso si hay un mecanismo de tiempo de espera y retroceso, aún puede hacer que estos subprocesos intenten repetidamente pero nunca se bloqueen.

3. Detección de interbloqueo: la detección de interbloqueo significa que cada vez que un hilo adquiere un bloqueo, se registrará en el hilo y en las estructuras de datos relacionadas con el bloqueo (mapa, gráfico, etc.). Además, cada vez que un hilo solicita un bloqueo, también debe registrarse en esta estructura de datos. La detección de interbloqueo es un mejor mecanismo de prevención de interbloqueo, es principalmente para aquellos escenarios donde es imposible lograr bloqueos secuenciales y el tiempo de espera de bloqueo no es factible.

Alcance de Bean en primavera

1. Singleton: Solo habrá una instancia de Bean compartida en el contenedor Spring IoC, sin importar cuántos Beans se refieran a ella, siempre apuntará al mismo objeto. El alcance Singleton es el alcance predeterminado en Spring.

2. Prototipo: Cada vez que se obtiene un bean definido por prototipo a través del contenedor Spring, el contenedor creará una nueva instancia de Bean.Cada instancia de Bean tiene sus propias propiedades y estado, mientras que el singleton tiene un solo objeto globalmente.

3. Solicitud: En una solicitud Http, el contenedor devolverá la misma instancia del Bean. Para diferentes solicitudes Http, se generará un nuevo bean y el bean solo es válido en la Solicitud Http actual.

4. Sesión: en una sesión Http, el contenedor devolverá la misma instancia del Bean. Una solicitud para una sesión diferente creará una nueva instancia, y la instancia del bean solo es válida en la sesión actual.

5. Sesión global: en una sesión Http global, el contenedor devolverá la misma instancia del Bean, que solo es válida cuando se utiliza el contexto del portlet.

¿Qué patrones de diseño se utilizan en el marco de Spring?

1. Modo proxy: se usa más en AOP y en remoto.

2. Modo singleton: el bean definido en el archivo de configuración de Spring tiene por defecto el modo singleton.

3. Modo de método de plantilla: se utiliza para resolver el problema de la duplicación de código.

4. Modo de controlador frontal: Spring proporciona DispatcherServlet para distribuir solicitudes.

5. Modo de inyección de dependencia: se ejecuta a través del concepto central de la interfaz BeanFactory / ApplicationContext.

6. Patrón de fábrica: BeanFactory se utiliza para crear instancias de objetos.

¿Cuál es el núcleo de springmvc, cómo se maneja el proceso de solicitud y cómo se logra la inversión del control?

Núcleo: inversión de control y orientación a aspectos

Solicitar flujo de procesamiento:

  1. Primero, el usuario envía una solicitud al controlador frontal, y el controlador frontal decide qué controlador de página seleccionar para procesar de acuerdo con la información de la solicitud (como URL) y le delega la solicitud, que es la parte lógica de control de la anterior. controlador;
  2. Una vez que el controlador de página recibe la solicitud, realiza un procesamiento funcional. Primero, necesita recopilar y vincular los parámetros de la solicitud a un objeto, y verificarlo, y luego delegar el objeto de comando al objeto comercial para su procesamiento; después del procesamiento, devuelve un ModelAndView (datos del modelo y lógica) Nombre de la vista);
  3. El controlador frontal retoma el control y luego selecciona la vista correspondiente para renderizar de acuerdo con el nombre de vista lógica devuelta, y pasa los datos del modelo a la vista para renderizar;
  4. El controlador frontal retoma el control nuevamente y devuelve la respuesta al usuario.

Cómo lograr la inversión de control:

  • Cada vez que usamos el framework Spring, debemos configurar el archivo xml, este xml configura el id y la clase del bean.
  • El bean predeterminado en Spring es el modo de instancia única, y esta instancia se puede crear a través del mecanismo de reflexión de referencia de clase del bean.
  • Por lo tanto, el marco de primavera crea instancias para nosotros a través de la reflexión y las mantiene para nosotros.
  • A necesita hacer referencia a la clase B, y el marco de Spring pasará la referencia de la instancia B a la variable miembro de A a xml.

Entrevista de I + D de ByteDance Java 99 preguntas (incluidas las respuestas): JVM + Spring + MySQL + Thread Pool + Lock

 

30 preguntas comunes sobre las preguntas de la entrevista avanzada de Java de BAT

  1. ¿Cuáles son las clases más utilizadas en Spring DAO?
  2. ¿Cómo usar SLF4J en la aplicación Spring?
  3. ¿Cuál es el alcance predeterminado de Spring beans?
  4. Use el bean @Required pero no asociado para anotar el método setter, ¿qué sucederá?
  5. Dado que el recorrido de preorden y el recorrido de orden medio de un árbol binario son ABDEGCFH y DBGEACHF respectivamente, ¿cuál es el recorrido posterior al orden del árbol binario?
  6. ¿La palabra clave volátil garantiza la seguridad de los subprocesos?
  7. ¿Puede Java crear objetos sin utilizar constructores?
  8. ¿Cuál es el mecanismo de concurrencia de los programas Java?
  9. ¿El método resume () es responsable de restaurar la ejecución de qué hilos?
  10. ¿Qué es LinkedHashSet?
  11. ¿Qué son los parámetros variables?
  12. ¿Cuál es el propósito de las afirmaciones?
  13. ¿Cuándo usar afirmaciones?
  14. ¿Qué es la recolección de basura?
  15. ¿Explica la recolección de basura con un ejemplo?
  16. ¿Cuándo se realiza la recolección de basura?
  17. ¿Mejores prácticas para la recolección de basura?
  18. ¿Qué es un bloque de datos de inicialización?
  19. ¿Qué es un inicializador estático?
  20. ¿Qué es un bloque de inicialización de instancia?
  21. ¿Qué es una expresión regular?
  22. ¿Qué es la tokenización?
  23. ¿Dar un ejemplo de tokenización?
  24. ¿Cómo usar la tokenización de la clase de escáner?
  25. ¿Cómo agregar horas a un objeto de fecha?
  26. ¿Cómo dar formato a los objetos de fecha?
  27. ¿Cuál es el propósito de la clase Calendar en Java?
  28. ¿Cómo obtener una instancia de la clase de calendario en Java?
  29. ¿Explica algunos métodos importantes en la clase de calendario?
  30. ¿Cuál es el propósito de la clase de formato numérico?

Beneficios del lector

Debido al espacio limitado, algunas respuestas no se mostrarán en su totalidad. He recopilado las respuestas a estas preguntas de la entrevista en documentos PDF, y también recopilé algunas preguntas detalladas; aunque tomó un poco de tiempo, estoy dispuesto a compartirlas de forma gratuita. , Espero ayudar a los ingenieros de Java que lo necesiten y salvar a todos los que están en Internet para que dediquen tiempo a buscar información.

¡Los amigos que lo necesiten pueden hacer clic aquí para obtenerlo gratis! !

Finalmente, espero ver a mis amigos mover los dedos y ayudar a reenviarlo, lo que ayudará a más amigos.

¡Les deseo a todos un feliz estudio!

Supongo que te gusta

Origin blog.csdn.net/m0_46995061/article/details/114265124
Recomendado
Clasificación