web-dev-qa-db-fra.com

Java: analyse non-tas

nous avons le problème que notre mémoire non-tas s'accroît tout le temps. nous devons donc redémarrer notre jee (Java8) - webapp tous les 3 jours (comme vous pouvez le voir sur la capture d'écran ici: capture d'écran de mémoire non-tas et mémoire-tas )

J'ai déjà essayé de savoir ce qui remplit ce non-tas. Mais je n'ai trouvé aucun outil pour créer un dump-heap. avez-vous une idée de la façon dont je pourrais enquêter sur cette question pour savoir quels éléments sont en pleine croissance?

Version Java

Java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)

Version Tomcat

Apache Tomcat Version 7.0.59
7
stefa ng

L'utilisation de la mémoire non en tas, fournie par MemoryPoolMXBean compte les pools de mémoire suivants:

  • Métaspace
  • Espace de classe compressé
  • Cache de code

En d'autres termes, les statistiques de mémoire standard non-tas incluent les espaces occupés par des méthodes compilées et des classes chargées. Très probablement, l'utilisation croissante de la mémoire non-tas indique une fuite du chargeur de classes.

Utilisation

  • jmap -clstats PID pour vider les statistiques du chargeur de classe;
  • jcmd PID GC.class_stats pour imprimer les informations détaillées sur l'utilisation de la mémoire de chaque classe chargée. Ce dernier nécessite -XX:+UnlockDiagnosticVMOptions.
4
apangin

Comme @apangin le fait remarquer, il semble que vous utilisiez davantage de métaspace au fil du temps. Cela signifie généralement que vous chargez plus de classes. J'enregistrerais les classes en cours de chargement et les méthodes en cours de compilation et essayerais de limiter le nombre de tâches effectuées en production de manière continue. Il est possible que vous ayez une bibliothèque qui génère du code en continu mais ne le nettoie pas. C’est là que regarder quelles classes sont en cours de création pourrait vous donner une indication quant à laquelle.


Pour la mémoire native non-tas.

Vous pouvez consulter le mappage de la mémoire sous Linux avec /proc/{pid}/maps. Cela vous permettra de connaître la quantité de mémoire virtuelle utilisée.

Vous devez déterminer si cela est dû à 

  • nombre croissant de threads ou de sockets
  • byteBuffers directs utilisés.
  • une bibliothèque tierce qui utilise la mémoire native/directe.

En regardant vos graphiques, vous pouvez réduire votre masse, augmenter votre mémoire directe maximale et prolonger le temps de redémarrage à une semaine ou plus, mais une meilleure solution résoudrait le problème.

0
Peter Lawrey

Avec Java 8, les métadonnées de classe sont maintenant dans une section de mémoire non en tas appelée Metaspace (et plus dans PermGen). Si votre mémoire non-tas est principalement consommée par Metaspace , vous pouvez la résoudre avec jstat .

Ce n'est pas un outil général pour analyser la mémoire non-tas. Mais cela pourrait toujours aider dans votre cas.

0
Codo