Essayer de localiser une fuite! Que signifie anon pour pmap?

J’essaie de localiser ma mémoire pour un processus java fonctionnant sous Linux. Quelqu’un m’a suggéré d’utiliser pmap -x pour voir exactement ce que fait la mémoire.

La sortie est vraiment longue mais en gros une bonne partie est une répétition de ceci:

00007fbf75f6a000 1016 - - - rwx-- [ anon ] 00007fbf76068000 12 - - - ----- [ anon ] 

Qu’est-ce que cela signifie exactement? Pourquoi ai-je tellement d’entrées (4000+)?

Les blocs Anon sont des “gros” blocs alloués via malloc ou mmap – voir les pages de manuel. En tant que tels, ils n’ont rien à voir avec le tas Java (hormis le fait que le tas entier doit être stocké dans un tel bloc).

D’après mon expérience, les stacks de fils utilisent également des blocs anon. Si vous voyez beaucoup de blocs qui ont tous la même taille, et que cette taille est comprise entre 512 Ko et 4 Mo (l’exemple ci-dessous est répété plus d’une douzaine de fois pour un processus Tomcat en cours d’exécution), c’est la cause probable. Selon le programme, vous pouvez en avoir jusqu’à quelques dizaines; Si vous voyez des milliers, cela signifie que vous avez un problème avec le threading.

 b089f000 504K rwx-- [ anon ] b091d000 12K ----- [ anon ] b0920000 504K rwx-- [ anon ] b099e000 12K ----- [ anon ] b09a1000 504K rwx-- [ anon ] b0a1f000 12K ----- [ anon ] 

Mais cela laisse une question: pourquoi utilisez-vous pmap pour diagnostiquer un problème de mémoire Java?

Voir cette partie cette partie de l’optimisation des performances du système pour la mémoire anonyme.

Utilisez Eclipse MAT (lorsque vous obtenez des exceptions OutOfMemoryException dans le tas Java, pas le segment de mémoire natif).

J’ai déjà vu ce modèle dans une fuite de fil. Si vous avez du code qui tente de regrouper des threads, mais en quelque sorte gâche et fuit un thread, vous obtenez un pattern comme celui-ci dans pmap.

Je pense que chaque bit de mémoire correspond à la taille minimale de la stack pour le thread, mais cela n’a certainement rien à voir avec le tas dans notre cas.
Nous avons toujours des OutOfMemoryErrors lorsque nous atteignons les limites du système d’exploitation, même si nous analysons le tas, il n’est pas suralloué.

Quand nous avons eu un problème comme celui-ci pmap [pid] | grep -c 12K pmap [pid] | grep -c 12K s’est avéré être le nombre de threads utilisés.