Entrevistador: ¿Alguna vez ha realizado un ajuste de JVM en el trabajo? Dígame qué ajuste de JVM ha realizado.
Creo que este tipo de pregunta se encontrará en la mayoría de las entrevistas, pero discutámoslo hoy.
Después de tantos años de desarrollo y verificación, la JVM es muy robusta en general. Personalmente, creo que en el 99% de los casos, básicamente no es necesario ajustar la JVM.
Por lo general, nuestro ajuste de parámetros jvm seguirá las recomendaciones oficiales:
- XX:Nueva relación=2
- XX:Relación de Supervivientes=8
- La memoria del montón se establece en aproximadamente 3/4 de la memoria física
...
Los valores predeterminados (recomendados) de los parámetros de JVM son valores relativamente razonables obtenidos a través de pruebas repetidas por parte del equipo de JVM y la verificación completa de los predecesores, por lo que generalmente son más confiables y comunes, y generalmente no causan problemas importantes.
Lo que la mayoría de los estudiantes encuentran con más frecuencia es que sus propios errores de código conducen a OOM, alta carga de CPU, GC frecuente, etc. Estos escenarios son básicamente reparaciones de código y, por lo general, no es necesario mover la JVM.
No hay un absoluto en todo, y algunas empresas aún necesitan ajuste de jvm. Generalmente, es el ajuste de parámetros para que sea más adecuado para nuestro negocio. En lugar de cambiar su código fuente.
¿Es necesario ajustar jvm?¿Puede un mejor recolector de basura resolver el problema?
- Sobre el combate real
- Independientemente de los factores para hacer frente a la entrevista, actualizar el recolector de basura será una de las formas más efectivas, como actualizar CMS a G1 o incluso ZGC.
- ángulo de la entrevista
- Responder directamente para actualizar el recolector de basura puede terminar el tema, por lo que la respuesta no agregará puntos sino que deducirá puntos. Entonces, puede responder para actualizar el recolector de basura, pero no puede responder simplemente para actualizar el recolector de basura.
¿Pasos de optimización de JVM?
Para los indicadores centrales de la JVM, nuestro enfoque y las herramientas de uso común son las siguientes:
- indicador de la CPU
- Averigüe qué procesos utilizan más CPU
- Ver los subprocesos que hacen un uso más intensivo de la CPU
- Ver información de la instantánea de la pila de subprocesos
- Analice puntos de acceso de ejecución de código
- Vea qué código requiere el mayor tiempo de ejecución de la CPU
- Ver el porcentaje de tiempo de CPU utilizado por cada método
Herramientas comunes: JProfiler, JVM Profiler, Arthas...// 显示系统各个进程的资源使用情况 top // 查看某个进程中的线程占用情况 top -Hp pid // 查看当前 Java 进程的线程堆栈信息 jstack pid
- Métricas de memoria JVM
- Compruebe si la configuración actual del parámetro de memoria de almacenamiento dinámico de JVM es razonable
- Ver estadísticas de objetos en el montón
- Ver instantáneas de almacenamiento en montón y analizar el uso de la memoria
- Compruebe si el crecimiento de la memoria en cada área del montón es normal
- Vea qué área causó el GC
- Compruebe si la memoria se puede recuperar normalmente después de GC
// 查看当前的 JVM 参数配置 ps -ef | grep java // 查看 Java 进程的配置信息,包括系统属性和JVM命令行标志 jinfo pid // 输出 Java 进程当前的 gc 情况 jstat -gc pid // 输出 Java 堆详细信息 jmap -heap pid // 显示堆中对象的统计信息 jmap -histo:live pid // 生成 Java 堆存储快照dump文件 jmap -F -dump:format=b,file=dumpFile.phrof pid
- Métricas de GC de JVM
- Compruebe si el tiempo de GC por minuto es normal
- Compruebe si el número de YGC por minuto es normal
- Comprobar si los tiempos de FGC son normales
- Compruebe si el tiempo de FGC único es normal
- Vea el consumo de tiempo detallado de cada etapa de un solo GC y encuentre la etapa con un consumo de tiempo serio
- Compruebe si la edad de promoción dinámica del objeto es normal.
Registro de GC. Parámetros comunes de JVM:
// 打印GC的详细信息 -XX:+PrintGCDetails // 打印GC的时间戳 -XX:+PrintGCDateStamps // 在GC前后打印堆信息 -XX:+PrintHeapAtGC // 打印Survivor区中各个年龄段的对象的分布信息 -XX:+PrintTenuringDistribution // JVM启动时输出所有参数值,方便查看参数是否被覆盖 -XX:+PrintFlagsFinal // 打印GC时应用程序的停止时间 -XX:+PrintGCApplicationStoppedTime // 打印在GC期间处理引用对象的时间(仅在PrintGCDetails时启用) -XX:+PrintReferenceGC
Aquí adjunto algunos parámetros de mi propia configuración de servicio y las representaciones actuales
-Xms1024m
-Xmx1024m
-Xmn512m
-Xss512k
-XX:SurvivorRatio=8
-XX:+UseConcMarkSweepGC
..
Explique el significado de estos parámetros:
S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
Descripción general de los parámetros de jvm
- Significado de los parámetros de JVM
nombre del parámetro | significado |
---|---|
-Xms | tamaño de pila inicial |
-Xmx | tamaño máximo de almacenamiento dinámico |
-Xmn | tamaño de la generación joven |
-XX:NuevoTamaño | Establecer el tamaño de la generación joven |
-XX:MaxNewSize | Máximo de generación joven (para 1.3/1.4) |
-XX: Tamaño permanente | Establecer el valor inicial de la generación permanente (perm gen) |
-XX:TamañoMáxPerm | Establecer el valor máximo de la generación permanente |
-Xss | Tamaño de pila por subproceso |
-XX:Tamaño de pila de subprocesos | Tamaño de la pila de hilos |
-XX: nueva relación | La proporción de la generación joven (incluyendo Eden y dos áreas de Survivor) a la generación anterior (excluyendo la persistente |
-XX:Proporción de supervivientes | La relación de tamaño del área de Eden al área de Survivor |
-XX:LargePageSizeInBytes | El tamaño de la página de memoria no se puede configurar demasiado grande, lo que afectará el tamaño de Perm |
-XX:+Usar métodos de acceso rápido | Optimización rápida de tipos primitivos |
-XX:+Deshabilitar GC explícito | Cierre System.gc() |
-XX:Umbral de tenencia máx. | edad máxima de la basura |
-XX:+OpcionesAgresivas | acelerar la compilación |
-XX:+Usar bloqueo sesgado | Rendimiento mejorado del mecanismo de bloqueo. |
-Xnoclassgc | deshabilitar la recolección de basura |
-XX:SoftRefLRUPolicyMSPerMB | Vida útil de SoftReference en espacio libre por megaheap |
-XX:PretenureSizeUmbral | Los objetos que superan el tamaño se asignan directamente en la generación anterior |
-XX:TLABWasteTargetPercent | TLAB como porcentaje del área de Edén |
-XX:+RecopilarGen0primero | Ya sea para iniciar YGC durante FullGC |
- Parámetros relacionados con el colector paralelo
nombre | significado |
---|---|
-XX:+UsarParallelGC Completo | GC utiliza MSC paralelo |
-XX:+UsarParNuevoGC | Establecer generación joven para recoger en paralelo |
-XX: subprocesos GC paralelos | Número de hilos para el colector paralelo |
-XX:+UsarParallelOldGC | El método de recolección de basura de la generación anterior es la recolección paralela |
-XX:MaxGCPauseMillis | Tiempo máximo para la recolección de basura de cada generación joven |
-XX:+UsarPolíticaDeTamañoAdaptable | Seleccione automáticamente el tamaño del área de generación joven y la proporción correspondiente del área Superviviente |
-XX:RelaciónTiempoGC | Establezca el porcentaje de tiempo de recolección de basura para programar el tiempo de ejecución |
-XX:+ScavengeBeforeFullGC Completo | Llame a YGC antes de GC |
- Parámetros relacionados con CMS
nombre | significado |
---|---|
-XX:+UsarConcMarkSweepGC | Usar colección de memoria CMS |
-XX:CMSFullGCsBeforeCompaction | Cuántas veces realizar la compresión de memoria |
-XX:+CMSParallelRemarkHabilitado | pausa de marca inferior |
-XX+UsarCMSCompactAtFullCollection | Durante FULLGC, la compresión de la vieja generación |
-XX:+UsarCMSIniciandoOcupaciónSolo | Inicie la recopilación de CMS con una definición de inicialización definida manualmente |
-XX:CMSInitiatingOccupancyFraction=70 | Usar cms como recolección de basura inicia la recolección de CMS después del 70% de uso |
-XX:CMSInitiatingPermOccupancyFraction | Se activa cuando el uso de PermGen alcanza la proporción |
-XX:+CMSIModoIncremental | establecer en modo incremental |
- Información suplementaria
nombre | significado |
---|---|
-XX:+ImprimirGC | imprimir gc |
-XX:+ImprimirGCDetalles | detalles de gc |
-XX:+PrintGCApplicationStoppedTime | Imprime cuánto tiempo estuvo en pausa el programa durante la recolección de elementos no utilizados. Se puede combinar con lo anterior |
-XX:+PrintGCApplicationConcurrentTime | Imprime el tiempo de ejecución ininterrumpido del programa antes de cada recolección de basura.Se puede mezclar con lo anterior |
-XX:+ImprimirHeapAtGC | Imprima información detallada de la pila antes y después de la GC |
-Xloggc:nombre de archivo | Registre la información de registro relevante en un archivo para su análisis. Úselo con lo anterior |
-XX:+ImprimirHistogramaClase | la basura se recolecta antes de imprimir el histograma. |
-XX:+ImprimirTLAB | Ver el uso del espacio TLAB |
-XX:+ImprimirDistribución de tenencia | Ver el umbral de nuevos ciclos de supervivencia después de cada GC menor |