web-dev-qa-db-fra.com

Le tas d'Old Gen est plein et l'Eden et le Survivor sont bas et presque vides

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.enter image description here

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.

22
Bogdan

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

26
R.Moeller