Ejercicio de práctica de ajuste de JVM, mi madre ya no está preocupada por la optimización de mi rendimiento

¡Continúe creando, acelere el crecimiento! Este es el tercer día de mi participación en el "Nuggets Daily New Plan · June Update Challenge",Haga clic para ver los detalles del evento

Hola a todos, soy Wild Man. Este artículo es el último artículo sobre el ajuste del rendimiento de JVM y también es un artículo práctico muy importante.

Como dice el refrán, solo hable pero no practique, manejo falso

Este artículo práctico llevará a todos a practicar juntos.

7. Ajuste del combate real

7.1 Medio ambiente

  • Todavía usamos el mismo caso en la sección anterior del recopilador, esta vez para un análisis detallado de la memoria.
  • Use el jdk8 principal en la empresa para ejecutar, otros parámetros de la versión jdk pueden ser ligeramente diferentes.
  • Los comandos y herramientas de análisis que vienen con jdk le brindan información adicional
  • Aquí utilizamos herramientas de análisis gráfico en línea, concisas y eficientes:gceasy.io
  • parámetros de registro gc:
 -XX:+PrintGC 输出GC日志
 -XX:+PrintGCDetails 输出GC的详细日志
 -XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
 -XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
 -XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
 -Xloggc:gc.log   jdk8日志文件的输出
 ​
 -Xlog:gc*:gc.log  jdk11日志输出方式略有不同
复制代码

7.2 Estado inicial

7.2.1 Parámetros

 -Xmx32m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:gc.log
复制代码

imagen.png

7.2.2 Registro de ejecución

Después de ejecutar por un tiempo, verá gc.log en el directorio del proyecto

imagen.png

7.2.3 Análisis de registro

Abra la página de inicio de gceasy, haga clic en Analizar después de cargar para ver los resultados del análisis

imagen.png

1) Descripción general de la memoria

Los jóvenes y los viejos están llenos y obviamente son insuficientes. Necesitan ser ampliados. El meta está inactivo y se puede reducir.

imagen.png

2) Situación general del tiempo

El tiempo de recolección está mayormente dentro de los 10 ms, lo que indica que la velocidad de recolección está bien, pero la cantidad de reciclaje obviamente es demasiado alta y el rendimiento general es del 94 %.

imagen.png

3) El montón antes y después del reciclaje obviamente se agita con frecuencia, y el total es alto

imagen.png

4) Cuando el intervalo de GC es largo, se produce una gran cantidad de FullGC

imagen.png

5) Liberación eficiente de espacio masivo en FullGC

imagen.png

6) Recuperación y liberación

El efecto de recuperación de la generación joven y la generación anterior es promedio, y las dos líneas antes y después de la recuperación incluso se cruzan, y la desviación debe estar lejos para indicar que hay una disminución significativa en la memoria.

Metaspace es relativamente estable

imagen.png

7) A&P: La situación en la que el objeto se promueve de la generación joven a la generación anterior

Las promociones frecuentes y los movimientos intergeneracionales indican que la generación joven no es suficiente, una vez que se acumula la generación anterior, es muy fácil causar fullGC.

imagen.png

8) Tiempos de GC y estadísticas de tiempo

Hay 591 GC, y 45 de ellos son FullGC, ¡lo cual es intolerable!

El tiempo total de GC es de 2,820 s, y FullGC representa casi la mitad

imagen.png

9) Situación de pausa del GC

El tiempo total y el tiempo medio por GC es de 4,77 ms

imagen.png

10) La razón por la que se activa GC

El umbral de recolección de elementos no utilizados se alcanza habitualmente 45 veces.

La falla de asignación de memoria provoca la recuperación, lo que afectará la ejecución comercial normal.

imagen.png

7.3 Ajuste preliminar

7.3.1 Parámetros

分析上面的情况,明显年轻代老年代内存均严重不足,那么最简单粗暴的方式,我们加大内存

 -Xms256m -Xmx256m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:gc.log
复制代码

7.3.2 二次分析

重复上面的步骤,新开一个浏览器页签,方便对比分析日志,重点关注几个点:

1)总内存够用了,但是年轻代依然被吃爆。年老代闲置。

imagen.png

2)吞吐量上升,耗时特别长的gc分部区间明显减少,甚至消失

imagen.png

3)gc前后的空间曲线对比明显

imagen.png

4)FullGC消失!

imagen.png

5)GC大批量的内存释放发生在了年轻代

imagen.png

6)年轻代的回收前后两条曲线不再交叉,被明显剥离

imagen.png

7)年老代表示情绪稳定

imagen.png 8)年轻到老年代的晋升明显减少

imagen.png

9)FullGC完全消失,总GC次数明显减少到49,总停顿时间从上次的2.8s降低到0.3s

imagen.png

10)晋升的对象明显减少,创建速度提升

imagen.png

11)不再发生内存分配失败造成gc的现象

imagen.png

7.4 二次调优

7.4.1 参数

结合上次调优,我们发现,年轻代依然不够用,年老代闲置,对象还是会频繁从年轻代晋升到年老代。

结合我们的业务场景,大批量对象在请求后会被释放,属于短生命周期。包括我们现实中从数据库请求发送到网页后对象就完成了实名,属于同类场景。

所以,加大年轻代比例!

 -Xms256m -Xmx256m -XX:NewSize=250m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:gc.log
复制代码

7.4.2 日志分析

同样是256的内存,我们再次跑出日志分析看看差异

1)年轻代已基本够用,很少有对象再跑到老年代

imagen.png

2)吞吐量进一步上升

imagen.png

思考一下,那为什么pause的平均时间还变长了呢???

答:次数变少了,单次需要收集的对象多了,所以肯定要占时间,我们接着往下看总耗时!

3)堆回收空间变化明显

imagen.png

4)gc次数明显下降到8次,总时间进一步降低到80ms

imagen.png

7.5 小结

  • 机器主要用来跑java服务的话,一般是需要调优的。因为默认堆最大只占物理内存的1/4
  • jvm的调优没有标准可言,不同业务场景的内存占用和增长情况不同。调整需要根据结果一步步来,直到最优。
  • 调优工具很多,gceasy属于简单直观的ui操作,jvm自带工具大多是命令行且功能较少,在扩展资料里。
  • parallel是jdk8下的默认收集器,切换不同收集器后的调试与上面过程一致,感兴趣的同学可以逐个尝试。

Bueno, el JVM调优实战contenido relacionado de hoy está aquí, nos vemos en la próxima edición. Si lo encuentra útil, por favor, dale me gusta y márquelo. Su reconocimiento es nuestra mayor motivación.

La siguiente es JVMuna serie de artículos sobre tuning, espero que pueda ser útil para todos.

Productos secos anteriores:

  1. ¿Cómo puedo convertirme rápidamente en arquitecto?
  2. [Fotos y textos] ¡Este artículo explica la arquitectura JVM, la estructura del archivo de clase y la estructura del código de bytes! ! )
  3. 4859 palabras, 609 líneas, explica claramente el área de datos en ejecución de JVM al mismo tiempo)
  4. No entiendo el mecanismo de carga de clases de JVM, ¿cómo optimizar el rendimiento de JVM? )
  5. Cuando crea un objeto nuevo, ¿qué hace por usted la capa inferior de la JVM? )
  6. 13651 palabras, explicarle la destrucción de objetos JVM)

Supongo que te gusta

Origin juejin.im/post/7103414151061438477
Recomendado
Clasificación