Un environnement de production est devenu très lent récemment. Le processeur du processus a pris 200%. Il a continué à fonctionner cependant. Après avoir redémarré le service, il a de nouveau fonctionné normalement. J'ai plusieurs symptômes: le tas d'espace du survivant Par a été vide pendant longtemps et la collecte des ordures a pris environ 20% du temps du processeur.
Options JVM:
X:+CMSParallelRemarkEnabled, -XX:+HeapDumpOnOutOfMemoryError, -XX:+UseConcMarkSweepGC, - XX:+UseParNewGC, -XX:HeapDumpPath=heapdump.hprof, -XX:MaxNewSize=700m, -XX:MaxPermSize=786m, -XX:NewSize=700m, -XX:ParallelGCThreads=8, -XX:SurvivorRatio=25, -Xms2048m, -Xmx2048m
Arch AMD64
Dispatcher Apache Tomcat
Dispatcher Version 7.0.27
Framework Java
Heap initial (MB) 2048.0
Heap max (MB) 2022.125
Java version 1.6.0_35
Log path /opt/newrelic/logs/newrelic_agent.log
OS Linux
Processors 8
System Memory 8177.964, 8178.0
Plus d'informations dans la photo ci-jointe. Lorsque le problème s'est produit sur le non-tas, le cache de code utilisé et la cms perm gen utilisée ont chuté de moitié.
J'ai pris les informations du newrelic.
La question est de savoir pourquoi le serveur commence à fonctionner si lentement.
Parfois, le serveur s'arrête complètement, mais nous avons constaté qu'il y a un problème avec PDFBox, lorsque vous téléchargez du pdf et contient des polices, il bloque la JVM.
Plus d'infos: j'ai observé que chaque jour l'Old gen se remplit. Maintenant, je redémarre le serveur quotidiennement. Après le redémarrage, tout est agréable et dandy, mais l'ancienne génération se remplit jusqu'au lendemain et le serveur ralentit jusqu'à ce qu'il ait besoin d'un redémarrage.
Par défaut, CMS commence à collecter simultanément si OldGen est à 70%. S'il ne peut pas libérer de mémoire en dessous de cette limite, il s'exécutera en permanence simultanément, ce qui ralentira considérablement le fonctionnement. Si OldSpace se rapproche de l'utilisation complète d'OldGen, il paniquera et retombera dans une pause du GC qui peut être très longue (comme 20 secondes). Vous avez probablement besoin de plus de marge dans OldGen (assurez-vous que votre application ne fuit pas la mémoire ofc!). De plus, vous pouvez abaisser le seuil pour démarrer une collecte simultanée (70% par défaut) en utilisant
-XX: + UseCMSInitiatingOccupancyOnly -XX: CMSInitiatingOccupancyFraction = 50
cela déclenchera la collecte simultanée à partir de 50% d'occupation et augmentera les chances que le CMS termine le GC à temps. Cela n'aidera que si votre taux d'allocation est trop élevé, à partir de vos graphiques, il semble que pas assez de headrooom/memleak + trop élevé XX: CMSInitiatingOccupancyFraction. Donnez au moins 500 Mo à 1 Go d'espace OldGen supplémentaire