2009-06-21 8 views
3

J'ai une application (winform exe) que je cours plusieurs fois. Est-ce que cela signifie que j'ai des assemblées partagées ou est-ce que chaque instance a sa propre copie des assemblées? Lorsque j'exécute l'application, elle utilise environ 30 Mo (dans le gestionnaire de tâches) et lorsque je lance une autre copie de l'application, elle utilise 30 Mo supplémentaires.Mémoire partagée et exécution de plusieurs copies d'un exécutable

Comment puis-je déterminer la quantité de mémoire utilisée et si je peux réduire l'utilisation excessive de la mémoire si j'exécute plusieurs instances?

Observe JD.

+0

Est-il lié statiquement ou dinamiquement? –

Répondre

4

C'est compliqué.

Commencez par lire mon article récent sur la mémoire virtuelle.

http://blogs.msdn.com/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx

OK, maintenant que vous avez une certaine compréhension de la façon dont fonctionne la mémoire virtuelle, vous pouvez comprendre comment le chargement du système d'exploitation DLL en mémoire. Supposons que vous avez deux processus qui ont tous deux besoin d'une page particulière de Foo.DLL. Le système d'exploitation va charger cette page en physique mémoire une seule fois, puis mapper cette page physique dans l'espace virtuel des deux processus. Donc, la quantité de mémoire physique utilisée est, disons, une page de 4 Ko. Mais ce 4KB apparaît dans les deux processus. Il est probable que la plupart de vos 30 Mo est de la mémoire physique partagée.

La façon de le savoir est d'être plus sophistiqué concernant votre utilisation du gestionnaire de tâches. Vous voulez y ajouter quelques colonnes et regarder à la fois "Working Set" et "Private Working Set". "Working Set" est le nombre total de pages, privées et partagées, actuellement utilisées par ce processus. "Private Working Set" est le nombre de ceux qui ne sont pas partagés.

Pour réduire votre consommation de mémoire - eh bien, commencez par comprendre pourquoi vous vous souciez de vous. Les machines ont beaucoup de mémoire ces jours-ci et 30 Mo est une quantité relativement faible de mémoire. À moins que vous ne trouviez une raison convaincante de travailler sur ce sujet, alors travaillez sur autre chose, comme accélérer votre programme ou ajouter plus de fonctionnalités. En supposant que vous ayez une raison de vous en soucier, procurez-vous quelques outils - en particulier, des profileurs de mémoire. Le profileur de mémoire .NET peut vous dire où sont toutes vos allocations et quelle est leur taille.

0

Je pense que vous avez répondu à votre propre question lorsque vous avez remarqué que l'exécution d'une deuxième copie de l'application utilise 30 Mo de mémoire supplémentaire.

Chaque instance de votre application s'exécutera dans son propre espace de traitement et ne partagera pas de ressources mémoire ou non avec toute autre instance de l'application. Sans savoir ce que fait votre application, la seule façon de réduire la quantité de mémoire utilisée est d'écrire des données sur le disque. Cela libérerait de la mémoire lorsque ces objets sortiraient de la portée, mais serait évidemment réutilisé lorsque vous lisez les données à partir du disque.

+0

Merci pour la réponse rapide Chris. Qu'en est-il de l'enregistrement des assemblys utilisés dans le GAC. Cela aiderait-il? –

+0

Je ne pense pas - mais je n'ai pas vraiment plongé dans le GAC comme je n'ai pas eu à le faire, donc je ne peux pas dire à coup sûr. – ChrisF

+0

Non, ils devraient toujours être chargés dans la mémoire du processus.De plus, la plupart des assemblages que vous utilisez actuellement dans votre application WinForms sont déjà dans le GAC. – weiqure

1

Si vous ne disposez pas de ressources statiques, vous pouvez, au lieu d'utiliser un second processus, ajouter un nouveau thread chaque fois que l'application est démarrée et qu'une instance de celle-ci existe déjà. C'est ce que fait Firefox.

+0

C'est une bonne idée. Il y aurait une utilisation supplémentaire de la mémoire, mais moins d'une copie complète de l'application. – ChrisF

Questions connexes