2011-06-18 3 views
2

Dans le programme de serveur multi-thread, j'ai trouvé la mémoire résident augmenter de 1G à 20G, et ne pas baisser. J'ai vérifié avec des outils de mémoire, et le programme n'a aucune fuite de mémoire. donc je pense que peut-être que la glibc contient de la mémoire libérée, n'a pas libéré sur OS. Je remplace alloc par mmap (en général, chaque mmap appliquera 65-100 k mémoire), attendez que lorsque j'appelle munmap, la mémoire mappée sera de retour à OS, mais j'observe le programme occupe toujours la mémoire 20G après avoir couru 1 jour? donc je veux savoir: munmap va certainement retourner la mémoire mappée à OS? et d'autres conseils? merci.mmap mémoire de petite taille, lorsque munmap, est glibc va libérer la mémoire mappée à OS?

+0

Quelle plateforme? –

+0

@Ignacio: Il est marqué "glibc". Est-ce que la glibc supporte toutes les plateformes où la réponse serait différente? (OK, donc il devrait probablement le marquer "linux".) – Nemo

+0

Nous utilisons munmap pour retourner de la mémoire au système alloué via mmap, et voyons une fuite de mémoire importante sur 10.6 qui ne se produisait pas sous 10.5. Cela me fait me demander s'il y avait un changement de comportement dans 10.6 –

Répondre

2

Oui, pour les petites allocations (< 128k, si je me souviens bien) la glibc utilisera généralement sbrk et maintiendra sa propre liste libre. Pour les allocations plus importantes, il utilisera mmap() et munmap().

munmap retournera définitivement la mémoire au système. C'est un appel système; glibc le passe juste au noyau. En supposant que ce soit Linux, vous pouvez vérifier le comportement de mmap pour vous en écrivant un code de test et en faisant cat /proc/PID/mapsPID est l'ID de processus de votre processus. Il imprime pour la ligne pour chaque zone de mémoire virtuelle (VMA) que le noyau maintient pour votre processus; essentiellement, un pour chaque mmap(). Cependant, même si la glibc ne restitue pas la mémoire au système, elle la recyclera via sa propre liste libre interne. Étant donné que, en plus du fait que l'utilisation de mmap()/munmap() n'a rien changé, vous est-il venu à l'esprit que votre programme a peut-être une fuite de mémoire?

Questions connexes