Entrevistador: ¿Tiene experiencia en ajuste de JVM en línea?

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:

  1. 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
    // 显示系统各个进程的资源使用情况
    top
    // 查看某个进程中的线程占用情况
    top -Hp pid
    // 查看当前 Java 进程的线程堆栈信息
    jstack pid
    
    Herramientas comunes: JProfiler, JVM Profiler, Arthas...
  2. 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
    
  3. 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
..

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

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

Supongo que te gusta

Origin blog.csdn.net/u011277745/article/details/124727390
Recomendado
Clasificación