9 votes

Différence entre la mémoire engagée et le RSS dans le processus de java

Je fais tourner un simple processus java avec jetty, pour lequel top indique 2.9g de RAM. La version du JDK utilisée est 1.8.0_112.

enter image description here

En utilisant Native Memory Tracking (jcmd), il apparaît que la mémoire totale engagée n'est que de 1,5G de mémoire.

enter image description here

La taille du pool de tampons directs est également très faible, comme le signale jvisualvm.

enter image description here

Je suis tout à fait conscient que la mémoire affichée par le NMT est une mémoire engagée qui n'a pas besoin d'être dans la RAM. Dans ce cas, la contribution de la mémoire NMT à la mémoire RES devrait être inférieure à 1,5 Go de mémoire RES.

Dans mon cas, la différence est de ~1.4G (RES affiche 1.4G de mémoire en plus) ce qui ne peut pas être attribué uniquement aux librairies partagées, jars. Est-ce que quelqu'un peut me suggérer comment savoir ce qu'est cette mémoire supplémentaire et quels outils peuvent être utilisés pour les vérifier ?

J'ai vérifié tous les problèmes existants en ligne/Stackoverflow, mais je n'ai pas trouvé de réponse appropriée.

4voto

apangin Points 4693

pmap -X <pid> montrera la répartition détaillée des RSS du point de vue de l'OS.

NMT ne compte pas la mémoire allouée par du code natif non JVM, même si cette mémoire est allouée par la bibliothèque de classe Java standard, par exemple par des méthodes natives de ZipInputStream . Voir la question connexe .

L'autre raison possible est malloc même. L'allocateur de mémoire natif renvoie rarement la mémoire inutilisée au système d'exploitation. Par exemple, si une application alloue 1 Go en petits morceaux avec malloc et libère ensuite tous ces morceaux, du point de vue de l'application, il y aura 1 Go de mémoire libre, mais le système d'exploitation comptera probablement ce 1 Go dans RSS. Cette mémoire appartient en fait au pool malloc de l'application et peut être réutilisée pour des applications futures. malloc appels.

Essayez d'utiliser des allocateurs alternatifs tels que jemalloc ou tcmalloc . D'ailleurs, ils disposent tous deux d'un profileur d'allocation qui peut aider à trouver des fuites de mémoire natives.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X