20230909 resumen de la entrevista java

1.colecciones de uso común de Java

ArrayList matriz dinámica, ajusta dinámicamente el tamaño, implementa la interfaz List
LinkedList lista doblemente enlazada, implementa la interfaz de lista y cola, adecuada para operaciones frecuentes de inserción y eliminación del
desorden HashSet, usa la tabla hash para realizar
el orden TreeSet, usa el árbol rojo-negro para realizar
el desorden HashMap. Use la tabla hash
TreeMap para ordenar, use el árbol rojo-negro
LinkedHashMap para ordenar, use la tabla hash y la lista doblemente vinculada, mantenga el orden de inserción
Cola de cola
Cola de prioridad PriorityQueue, ordene la pila de pila según la prioridad
, el último en entrar, primero en salir

2. Las diferencias y escenarios de uso entre árboles rojo-negro y árboles b+

Escenarios de aplicación: TreeSet y TreeMap en colecciones de Java, las listas vinculadas de HashMap mayores de 8 se convierten en árboles rojo-negro; configurar y mapear en stl de cpp; administración de memoria virtual de Linux Ventajas de los árboles rojo-negro en comparación con los árboles b+: se utiliza
rbt para la clasificación interna, b+t es una estructura de datos compatible con disco que se utiliza en la memoria externa; el árbol rojo-negro tiene una complejidad temporal más rápida para la inserción, eliminación y búsqueda.

3. Comparación entre ArrayList y LinkedList

1. ArrayList es una matriz dinámica y LinkedList es una lista vinculada.
2. El acceso aleatorio a la matriz es rápido y los enlaces se pueden agregar y eliminar rápidamente.
3. Arraylist debe configurarse manualmente en un tamaño fijo y el grado del vínculo. La libertad cambia dinámicamente.
4. Arraylist se expande a 1,5 veces.

4. Precauciones al usar ArrayList

1. Problema de subprocesos inseguros 1: dos subprocesos agregan elementos al mismo tiempo y garantizan que la capacidad se juzgue con éxito, lo que hace que la matriz se salga de los límites. 2. Problema de subprocesos inseguros 2: el valor del elemento
se sobrescribe para que esté vacío. escribir al mismo tiempo
Procesamiento seguro: sincronizadoList, agregar Lock, copyonwirteArrayList (copiar al escribir), usar ThreadLocal para asegurar el cierre del hilo

Cinco parámetros principales del grupo de subprocesos de Java

corePoolSize: el número de subprocesos centrales, el tamaño básico del grupo de subprocesos cuando no hay tarea.
MaximumPoolSize: el número máximo de subprocesos en el grupo de subprocesos.
keepAliveTime: cuando es mayor que el núcleo, el tiempo de supervivencia más largo del exceso de subprocesos inactivos durante el período de espera.
unidad: unidad de tiempo keepAliveTime
workQueue: almacena las tareas que se ejecutarán Cola de bloqueo
threadFactory: controlador de clases de fábrica para crear nuevos subprocesos
: cuando el grupo de subprocesos alcanza el número máximo de subprocesos y la cola de tareas está llena, las estrategias comunes incluyen lanzar una tarea, descartar la tarea, descartando la tarea más antigua y ejecutándola directamente en el hilo de la persona que llama

6. Cómo funciona el grupo de subprocesos

Insertar descripción de la imagen aquí

1. Menos que el núcleo, cree y ejecute directamente en el grupo de subprocesos centrales
2. Mayor o igual que el núcleo, únase a la cola y espere
3. La cola está llena, cree un subproceso no central y ejecútelo inmediatamente
4. La cola está llena , mayor o igual a max, procesamiento del controlador
5. Se completa la ejecución de la tarea Eliminar y eliminar un subproceso al mismo tiempo
6. Si el tiempo de inactividad excede el tiempo de vida y es mayor que el núcleo, los subprocesos adicionales dejarán de reciclarse.

7. ¿Por qué utilizar la cola de bloqueo?

1. Coordinar y controlar la ejecución de subprocesos para evitar la pérdida o acumulación de tareas
2. Almacenamiento en búfer de tareas para garantizar que no se ejecuten de inmediato, equilibrando efectivamente la velocidad de producción y consumo de las tareas
3. Gestión de subprocesos, cuando el subproceso del grupo de subprocesos está ocupado, nuevas tareas están esperando en la cola

Si se utiliza una cola sin bloqueo,
1. El número de subprocesos no está controlado y los recursos se agotan
2. Las tareas se pierden. Si la cola está llena, las nuevas tareas se descartan inmediatamente
3. Las condiciones de carrera pueden causar problemas de coherencia de los datos.

8.refrito de hashMap

El código hash de cada clave es el tamaño de la matriz del depósito len. Rehash significa que len se vuelve más grande, pero aún es uniforme.

9. Cómo diseñar el grupo de subprocesos cuando la CPU tiene un uso intensivo

Use el número de núcleos de CPU + 1 subproceso. +1 garantiza que cuando se produce una interrupción por falla de página y se bloquea, se pueden agregar subprocesos adicionales.
Idealmente, todos los núcleos de la CPU están ejecutando subprocesos en el grupo de subprocesos.

10. Cómo diseñar un grupo de subprocesos para uso intensivo de io

Número óptimo de subprocesos = 1 + io que consume mucho tiempo/cpu que consume mucho tiempo, mejorando así la utilización de la CPU y io

11.Principio de Threadlocal y escenarios de uso

Se refiere a las variables locales del hilo, haciendo que cada copia de variable sea independiente para cada hilo, logrando el aislamiento de la variable.
Cada subproceso tiene una variable miembro threadlocalmap, que se puede usar para almacenar datos.
Escenarios de uso:
1. Almacenar información del usuario globalmente.
2. Las variables para el aislamiento de subprocesos se encapsulan usando threadlocal
. 3. Cuando varios métodos usan el mismo objeto, use threadlocal en su lugar. de parámetros.transfer para reducir el acoplamiento de código; por ejemplo, threadlocal se usa en @transaction para guardar la conexión.

12.Notas sobre el uso de threadlocal

Problema de pérdida de memoria: significa que la memoria del montón asignada dinámicamente en el programa no se libera o no se puede liberar por algún motivo, lo que provoca un desperdicio de memoria, provoca que el sistema falle y finalmente se acumula para provocar un desbordamiento de memoria.

Dado que el objeto de entrada está modificado por una referencia débil, se borrará en la próxima recolección de basura para realizar la desvinculación del ciclo de vida del subproceso y del subproceso. En este momento, la clave de entrada es nula, pero hay
una referencia fuerte de referencia del subproceso actual. en el threadlocalmap, por lo que el valor no puede ser claro.

Por lo tanto, debemos eliminar manualmente el objeto de entrada.

La razón para usar referencias débiles es porque la clave se juzgará durante los procesos set y getEntry. Si la clave es nula, el valor también se establecerá en nulo. De esta manera, incluso si olvida llamar a remove, cuando threadlocal es destruido, el valor se borrará.

Uno de los aspectos más destacados del diseño en ThreadLocal es que la clave de la estructura de entrada en ThreadLocalMap utiliza referencias débiles. Imagínese, si usa referencias sólidas, significa que todos los datos en ThreadLocalMap están vinculados al ciclo de vida de Thread, por lo que es fácil causar pérdidas de memoria debido a la actividad continua de una gran cantidad de subprocesos. Si se utilizan referencias débiles, después de que la JVM activa el GC para reciclar las referencias débiles, ThreadLocal puede eliminar los valores cuya clave es nula en ThreadLocalMap la próxima vez que llame a get(), set() y remove(). métodos, que desempeñan el papel de eliminación diferida para liberar memoria.

En segundo lugar, habrá un recorrido correspondiente en ThreadLocalMap para verificar la ranura con una clave nula y eliminarla ~

Supongo que te gusta

Origin blog.csdn.net/weixin_40986490/article/details/132781726
Recomendado
Clasificación