Exercice de réglage JVM, ma mère ne s'inquiète plus de l'optimisation de mes performances

Continuez à créer, accélérez la croissance ! C'est le troisième jour de ma participation au "Nuggets Daily New Plan · June Update Challenge",Cliquez pour voir les détails de l'événement

Bonjour à tous, je suis Wild Man. Cet article est le dernier article sur le réglage des performances JVM, et c'est aussi un article pratique très important.

Comme dit le proverbe, parlez mais ne pratiquez pas, faux manche

Cet article pratique amènera tout le monde à pratiquer ensemble

7. Réglage du combat réel

7.1 Environnement

  • Nous utilisons toujours le même cas dans la section collecteur ci-dessus, cette fois pour une analyse détaillée de la mémoire.
  • Utilisez le jdk8 traditionnel dans l'entreprise pour fonctionner, d'autres paramètres de version de jdk peuvent être légèrement différents.
  • Les commandes et outils d'analyse fournis avec jdk vous fournissent des informations étendues
  • Nous utilisons ici des outils d'analyse graphique en ligne, concis et efficaces :gceasy.io
  • paramètres de journal 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 État initial

7.2.1 Paramètres

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

image.png

7.2.2 Journal d'exécution

Après avoir exécuté pendant un certain temps, vous verrez gc.log dans le répertoire du projet

image.png

7.2.3 Analyse du journal

Ouvrez la page d'accueil de gceasy, cliquez sur Analyser après le téléchargement pour voir les résultats de l'analyse

image.png

1) Aperçu général de la mémoire

Jeunes et moins jeunes sont tous pleins, et ils sont évidemment insuffisants, il faut les agrandir, la méta est inactive et peut être réduite.

image.png

2) Situation temporelle globale

Le temps de collecte est généralement inférieur à 10 ms, ce qui indique que la vitesse de collecte est correcte, mais le nombre de recyclages est manifestement trop élevé et le débit global est de 94 %.

image.png

3) Le tas avant et après le recyclage tremble évidemment fréquemment, et l'ensemble est élevé

image.png

4) Lorsque l'intervalle GC est long, un grand nombre de FullGC se produisent

image.png

5) Libération efficace de l'espace en vrac sur FullGC

image.png

6) Récupération et libération

L'effet de récupération de la jeune génération et de l'ancienne génération est moyen, et les deux lignes avant et après la récupération se croisent même, et l'écart devrait être loin pour indiquer qu'il y a une diminution significative de la mémoire.

Le métaspace est relativement stable

image.png

7) A&P : La situation où l'objet est promu de la jeune génération à l'ancienne génération

Les promotions fréquentes et les déménagements intergénérationnels indiquent que la jeune génération ne suffit pas.Une fois que l'ancienne génération s'accumule, il est très facile de provoquer un fullGC.

image.png

8) Temps GC et statistiques de temps

Il y a 591 GC, dont 45 sont des FullGC, ce qui est intolérable !

Le temps total de GC est de 2.820s, et FullGC représente près de la moitié

image.png

9) Situation de pause du GC

Le temps total et le temps moyen par GC est de 4,77 ms

image.png

10) La raison pour laquelle GC est déclenché

Le seuil de collecte des ordures est systématiquement atteint 45 fois.

L'échec de l'allocation de mémoire provoque la récupération, ce qui affectera l'exécution normale de l'entreprise.

image.png

7.3 Réglage préliminaire

7.3.1 Paramètres

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

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

7.3.2 二次分析

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

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

image.png

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

image.png

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

image.png

4)FullGC消失!

image.png

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

image.png

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

image.png

7)年老代表示情绪稳定

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

image.png

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

image.png

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

image.png

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

image.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)年轻代已基本够用,很少有对象再跑到老年代

image.png

2)吞吐量进一步上升

image.png

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

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

3)堆回收空间变化明显

image.png

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

image.png

7.5 小结

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

Eh bien, le JVM调优实战contenu connexe d'aujourd'hui est ici, nous vous verrons dans le prochain numéro. Si vous le trouvez utile, veuillez l'aimer et le mettre en signet. Votre reconnaissance est notre plus grande motivation.

Ce qui suit est JVMune série d'articles sur le réglage, j'espère que cela pourra être utile à tout le monde.

Produits secs passés :

  1. Comment devenir rapidement architecte ?
  2. [Photos et textes] Cet article explique l'architecture JVM, la structure des fichiers de classe et la structure du bytecode ! ! )
  3. 4859 mots, 609 lignes, expliquent clairement la zone de données en cours d'exécution JVM en même temps)
  4. Je ne comprends pas le mécanisme de chargement de classe de la JVM, comment optimiser les performances de la JVM ? )
  5. Lorsque vous créez un objet, que fait la couche inférieure de la JVM pour vous ? )
  6. 13651 mots, expliquez-vous la destruction d'objet JVM)

Guess you like

Origin juejin.im/post/7103414151061438477