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?
Répondre
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/maps
où PID
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?
- 1. La mémoire est beaucoup plus petite que la mémoire disponible
- 2. comment libérer de la mémoire lorsque NavigationService est appelé?
- 3. Libérer le contenu UIWebView de la mémoire, forcer l'application à libérer la mémoire
- 4. Comment libérer la mémoire?
- 5. Base de données mappée en mémoire
- 6. Comment libérer la mémoire?
- 7. Libérer la mémoire
- 8. libérer la mémoire ScrollView
- 9. libérer la mémoire opencv
- 10. Comment utiliser la mémoire épinglée/la mémoire mappée dans OpenCL
- 11. VA et adresses mémoire
- 12. Libérer de la mémoire, tout?
- 13. Comment libérer la mémoire associée par CGImageCreateWithImageInRect
- 14. UINavigationController: Libérer la mémoire de ViewController quand elle est apparue
- 15. Comment OS détermine la taille de la mémoire virtuelle
- 16. Comment libérer la mémoire de précharge MPMoviePlayerController
- 17. Libérer de la mémoire après utilisation
- 18. Comment libérer de la mémoire dans .NET?
- 19. pointeur passage à l'interface mémoire mappée
- 20. Libérer de la mémoire allouée avec newCString
- 21. Gestion de la mémoire - Quand libérer?
- 22. mmap() de tableaux ou de mémoire malloced
- 23. Opération d'appel système Mmap pouvant accéder aux emplacements de mémoire
- 24. Puis-je utiliser un seul appel à munmap() pour annuler le mappage de deux mappages de mémoire situés dans une plage contiguë de mémoire virtuelle?
- 25. Comment libérer l'allocation de mémoire?
- 26. NewStringUTF() et libérer de la mémoire
- 27. La taille de la mémoire tampon de la console d'erreur Firefox est trop petite
- 28. Impossible de libérer de la mémoire
- 29. Libérer des références jni de la mémoire
- 30. Quelle est la différence entre écrire dans un fichier et dans une mémoire mappée?
Quelle plateforme? –
@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
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 –