java8 “de java.lang.OutOfMemoryError: Metaspace”
Après le passage de notre application java (services en cours d'exécution sur Tomcat) JRE de Java 7 pour Java 8, nous avons commencé à voir java.lang.OutOfMemoryError: Metaspace
après l'exécution de quelques jours avec un volume élevé de trafic.
L'utilisation du tas était OK. Metaspace sauts après quelque temps, lorsque le même flux de code a été exécuté au cours des tests de performances.
Ce que pourrait être les causes possibles de l'metaspace problème de mémoire?
Les réglages actuels:
-server -Xms8g -Xmx8g -XX:MaxMetaspaceSize=3200m -XX:+UseParNewGC
-XX:+UseConcMarkSweepGC -XX:MaxGCPauseMillis=1000
-XX:+DisableExplicitGC -XX:+PrintGCDetails
-XX:-UseAdaptiveSizePolicy -XX:SurvivorRatio=7 -XX:NewSize=5004m
-XX:MaxNewSize=5004m -XX:MaxTenuringThreshold=12
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintFlagsFinal
-XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution
-XX:+PrintGCCause -XX:+PrintAdaptiveSizePolicy
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=3 -XX:GCLogFileSize=200M
Également l'application a une utilisation intensive de la réflexion. Nous avons également utiliser un chargeur de classe. Tous d'entre eux fonctionnent très bien dans java 7.
Puis-je supposer que la machine hôte a effectivement l'8g de ram physique disponible? Comme, gratuit, ne l'utilisez pas.
nous n'avons pas que de nombreuses classes dynamiques.
oui, il a près de 15 GO de libre.
plumbr.ue/outofmemoryerror/metaspace
OriginalL'auteur Jane | 2016-03-17
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous pouvez créer de la question avec la même demande (Ensemble des demandes), sur une période de temps.
C'est une bonne chose que vous avez MaxMetaspaceSize définis, autrement application va utiliser natif de la mémoire jusqu'à ce qu'il s'épuise à se développer.
Mais je vais commencer avec les étapes suivantes:
Je vais parler de mesures à l'échelle locale , mais à distance pour attacher JMX , vous devez ajouter la suite de la JVM des paramètres de l'application et de le démarrer et se connecter à distance sur le port 9999 et -XX:+UnlockDiagnosticVMOptions.
Une fois que vous avez la visualvm (jvisualvm) connecté à la JVM, cliquez sur le moniteur et ensuite de voir le nombre de classes chargées. De là, vous pouvez surveiller le tas ainsi que metaspace. Mais je vais ajouter les autres outils pour surveiller de près la metaspace.
sélection de carte de tri ((carte(tas.les objets (java.lang.Chargeur de classe'),
'{loader: c', count:.des classes.elementCount }'), 'lhs.le comte < ers.le comte'),
'toHtml () + "
"')
Mais la requête ci-dessus le nom de "classloader chargés de classe" sera lente qui se fait de montrer les classes chargées par chaque classloader.
Et maintenant, connectez
pour se connecter à la VM, puis une fois que vous êtes connecté, cliquez sur "Diagnostic commandes" dans la CGC, qui est sur la droite de la partie supérieure. Depuis, nous avons activé UnlockDiagnosticVMOptions , GC.class_stats pourrait être exécuté. Vous pouvez l'exécuter avec afficher toutes les colonnes et les imprimer au format csv. Donc la commande ressemblera à:
Et vous pouvez comparer la classe de statistiques sur différentes périodes et de trouver les classes qui sont la cause des problèmes(metaspace de croissance) ou les classes qui ont des informations connexes( de la méthode/de données de la méthode) dans metaspace. Comment analyser le csv sorties recueilli plus au temps: eh bien, je voudrais prendre que le csv et le charger jusqu'à deux tableau(représentant csv) dans une base de données ou un autre endroit pour comparer les GC.class_stats csv sorties où je peux courir certains SQL ou tout autre des outils d'analyse. Que donnerait une meilleure idée de ce qu'est exactement croissante dans metaspace.
La classe GC stats a colonnes suivantes:
Espère que cela aide. Aussi il semble que le bug est peut-être dans Java 8 si elle ne cause pas de fuite en 1.7.
Aussi les classes ne sont pas déchargé de metaspace si quelqu'un est tenue de toute référence à classloader. Si vous savez que votre chargeurs de classes sont censés être GCed et nul ne doit contenir la référence de votre chargeur de classe, vous pouvez revenir à la heap dump dans visualvm et cliquez sur le chargeur de classe de l'instance et cliquez à droite pour trouver la plus proche de chez GC racine" qui vous dira qui est maintenant la référence pour les chargeurs de classes.
je voulais dynamique des classes de proxy qui sont créés de façon synthétique. La réflexion de l'invocation à la même classe, à plusieurs reprises ne pas provoquer d'augmentation de la classe chargée de les compter.
OriginalL'auteur dillip pattnaik
nous avons eu le même problème et la cause a été 60K catégorie fichiers sont chargés dans metaspace de la mémoire, mais rien ne se déchargé.Ajouter en dessous de la JVM arg fixe hors de question.
https://issues.apache.org/jira/browse/CXF-2939
Espère que cette aide.
Cela a également résolu le problème pour moi. Pour plus d'informations: stackoverflow.com/questions/33255578/...
OriginalL'auteur user1550159
aussi, si certains auto deploy comme tomcat, ne PAS garder les sauvegardes dans tomcat\webapps sinon il peut-être essayer de charger la sauvegarde et entrent en collision avec ces ressources.
OriginalL'auteur Dove