2010-05-20 13 views
2

J'ai une application de bureau développée en C#. La taille de VM utilisée par l'application est très élevée. Je veux ajouter un filigrane à un fichier pdf, qui a plus de 10 000 pages, 10776 pages pour être exact, la taille de la machine augmente et parfois l'application se fige ou elle produit une exception de mémoire insuffisante.Comment libérer les VM/octets privés d'une application Desktop en C#

Y at-il une solution pour libérer/diminuer la taille VM programatically en C#

+0

Vous voulez dire, en dehors de ne pas allouer autant en premier lieu? Quel type d'utilisation de la mémoire voyez-vous de toute façon? –

+0

Bonne question. La gestion/utilisation de la mémoire dans des environnements collectés par des ordures (comme Java et .Net) me fait toujours un peu peur. J'ai toujours peur qu'ils finissent par prendre plus de mémoire que C++, où vous avez un contrôle total sur votre mémoire, mais je ne suis pas sûr à 100% à ce sujet. Existe-t-il des études comparant la consommation de mémoire dans les environnements GC et non-GC? – Patrick

+1

@Patrick J'ai trouvé le lien auquel je faisais référence. Je ne vais même pas faire semblant de comprendre tout cela mais ici c'est: http://msdn.microsoft.com/fr-fr/magazine/bb985010.aspx – Josh

Répondre

2

Environment.FailFast :)

Dans tout le sérieux cependant, une grande taille VM n'est pas nécessairement une indication d'un problème de mémoire. Je suis toujours confus quand il s'agit des différentes mesures de la mémoire, mais je crois que la taille de la VM est une mesure de la quantité d'espace d'adressage utilisé, pas nécessairement de la mémoire physique utilisée.

Voici un autre poste sur le sujet: (. Jeu de mots) What does "VM Size" mean in the Windows Task Manager?

Si vous pensez que vous avez un problème avec l'utilisation de la mémoire dans votre application, vous devrez sans doute envisager d'utiliser un profileur de mémoire pour trouver la cause racine C'est un peu difficile de s'y habituer au début, mais c'est une compétence précieuse. Vous seriez surpris de voir quel genre de problèmes de performance apparaissent lors du profilage.

+0

En effet, c'est la raison pour laquelle je ne fais jamais confiance au Gestionnaire des tâches, mais toujours utiliser l'Explorateur de Processus de Sysinternal, où vous pouvez voir explicitement les Octets Privés et la taille de VM. – Patrick

+0

Très vrai, les octets privés sont un nombre beaucoup plus significatif. –

+0

Mon application se bloque et génère parfois une exception de mémoire insuffisante. –

1

Cela dépend fortement de votre code source. Avec l'information donnée, tout ce que je peux dire, c'est qu'il vaut mieux avoir un profileur de mémoire et vérifier s'il y a de la place pour des optimisations.

Juste pour vous montrer comment l'utilisation de la mémoire pourrait être optimisée je voudrais vous montrer le example suivant. Au lieu d'utiliser la concaténation de chaînes comme celui-ci

string x = ""; 
for (int i=0; i < 100000; i++) 
{ 
    x += "!"; 
} 

en utilisant un StringBuilder est beaucoup plus mémoire- (et de temps) efficace qu'il n'attribue pas une nouvelle chaîne pour chaque concaténation:

StringBuilder builder = new StringBuilder(); 
for (int i=0; i < 100000; i++) 
{ 
    builder.Append("!"); 
} 
string x = builder.ToString(); 

La concaténation dans le premier exemple crée un nouvel objet chaîne à chaque itération qui occupe de la mémoire supplémentaire qui sera nettoyée uniquement lorsque le garbage collector est en cours d'exécution.

+0

Mon application se bloque et parfois manque de mémoire Exception –