Cela fait longtemps que j'ai appris ce truc, mais c'est parti.
Lorsqu'un système d'exploitation lance un processus, il lui affecte des pages à partir de la table de mémoire virtuelle. Le système d'exploitation est responsable du maintien d'une carte de la table de mémoire virtuelle à la mémoire réelle ou à l'espace de swap sur le disque. Lorsqu'un processus est tué, le système d'exploitation ne cesse de lui donner des cycles de processeur. Il effectue quelques opérations de nettoyage, dont l'une consiste à marquer toutes ses pages mémoire comme libres. Cela leur permet d'être réutilisés par d'autres applications. Le système d'exploitation nettoiera probablement également tous les descripteurs de ressources du processus, fermant automatiquement les fichiers, les connexions réseau, les canaux de processus à processus, etc. Ce processus est entièrement sous le contrôle de l'OS, et ces étapes vont être prises quelle que soit la façon dont le processus est mort.
Gardez à l'esprit que tout cela s'applique aux processus du système d'exploitation. Si vous avez une sorte de machine virtuelle et qu'elle exécute plusieurs processus virtuels à la fois, la machine virtuelle est responsable de décider comment leur allouer et leur désallouer. Du système d'exploitation, cependant, cela ressemble toujours à un processus. Donc, dans ce cas, si vous avez une machine virtuelle qui exécute plusieurs processus et que vous en tuez un au sein de la machine virtuelle, vous ne récupérerez probablement pas immédiatement la mémoire dans le système d'exploitation hôte. Mais vous le récupérerez dans la VM. Si vous tuez la machine virtuelle dans le système d'exploitation, cependant, le système d'exploitation va tuer la machine virtuelle (qui tue indirectement les processus de la machine virtuelle) et récupérer toute la mémoire (qui n'aura pas besoin de passer par un garbage collector, free () , supprimer ou toute autre chose).
Hautement spéculatif:
Si .NET s'exécute en tant que machine virtuelle avec plus d'une application .NET sur la même machine virtuelle, alors .NET pourrait conserver la mémoire qui n'est pas encore GCd, jusqu'à ce qu'il exécute le GC, et Windows penserait que .NET est en utilisant plus qu'il ne l'est vraiment. (Et si MS était vraiment glissant, Windows pourrait alors dire .NET au GC dans les situations de mémoire restreinte, mais cela ne sert à rien car c'est à cela que sert l'espace de permutation de disque.)
Si .NET fonctionnait de cette façon, le système d'exploitation le considérerait toujours comme un processus à des fins de système d'exploitation, qui prend la responsabilité de décider quoi conserver et quoi jeter, et ce n'est généralement pas le problème de Windows de dire à un processus dont il a besoin pour commencer à désallouer la mémoire. À ce stade, il est concevable que MS construise une API spéciale uniquement pour .NET afin que les processus .NET ressemblent aux processus Windows, sauf qu'ils ne le sont pas, c'est pourquoi les gens pourraient penser que la mémoire du processus n'était pas désallouée. C'est vraiment; c'est juste que vous regardez le mauvais processus.
Je ne connais pas suffisamment le .NET pour dire qu'il fonctionne réellement de cette façon; la machine virtuelle Java ne le fait certainement pas.
Fin des spéculations.
EDIT: en ce qui concerne la destruction d'un processus mauvais pour la gestion de la mémoire, cela nécessite que plusieurs processus soient alloués à partir du même pool (c'est-à-dire qu'ils ressemblent plus à des threads qu'à des processus réels) et que la mémoire ne soit pas libérée après la fin du processus. tué. Cela nécessiterait presque un système multitâche coopératif, car la mémoire virtuelle et le multitâche préemptif étaient, à ma connaissance, généralement implémentés ensemble (la machine virtuelle permettant d'isoler les processus les uns des autres et de les empêcher de piétiner dans la mémoire de l'autre). Avoir de la mémoire virtuelle, il est trivial de nettoyer après un processus au niveau du système d'exploitation; vous venez de déplacer toutes les pages du pool du processus vers le pool gratuit.