2009-08-05 3 views
1

J'ai un petit service WCF qui est exécuté sur une boîte XP avec 256 Mo de RAM fonctionnant dans VM.aspnet_wp conserve le recyclage en raison de sa forte consommation de mémoire. Comment puis-je le réparer?

Quand je fais une demande (avec une taille de demande d'environ 5mbs) à ce service, je reçois toujours le message suivant dans le journal des événements:

aspnet_wp.exe a été recyclé, car la consommation de mémoire dépassait les 153 Mo (60 pour cent de la RAM disponible).

et l'appel échoue avec l'erreur 500.

J'ai essayé d'augmenter la limite de mémoire à 95%, mais il faut encore toute la mémoire et ne parvient de la même manière disponible.

Il semble que quelque chose ne va pas avec mon application (je ne réutilise pas les tampons byte [] et peut-être quelque chose d'autre) mais je ne peux pas trouver la cause de cette surutilisation de la mémoire. Le profilage a montré que tous les objets CLR que j'ai en mémoire ne prennent pas beaucoup d'espace.

Faire une analyse de vidage avec windbg a montré la même situation - rien de si grand dans le tas d'objets.

Comment puis-je savoir ce qui contribue à une telle surutilisation de la mémoire?

Y a-t-il un moyen de faire un vidage juste avant que le processus ne soit recyclé (pendant l'utilisation de la mémoire de pointe)?

Répondre

2

Le blog de Tess Ferrandez "If broken it is, fix it you should" contient de nombreux conseils, astuces et recommandations pour résoudre ce genre de problème.

Vous utiliserez notamment Lab 3: Memory, où elle vous expliquera ce qui a causé la disparition de toute la mémoire de votre machine.

+0

J'ai beaucoup appris en utilisant les soluces de Tess et les outils de débogage. Ça vaut vraiment le coup. –

+0

Merci. Je n'ai pas vraiment résolu celui-ci car on m'a dit que nous n'aurions pas de telles machines en production et que la mémoire ne semble pas couler. Quoi qu'il en soit, j'ai implémenté mon propre MultiBufferMemoryStream qui implémente IXmlSerializable: D –

1

Pourrait être beaucoup de choses, difficile à diagnostiquer celui-ci. Avez-vous regardé perfmon pour voir si l'utilisation de la mémoire atteint son apogée sur le processus aspnet ou sur le serveur lui-même? 256 Mo est assez bas, mais il devrait toujours être capable de le gérer. Avez-vous un fichier SWAP sur cette machine? À quel moment prenez-vous le vidage de la mémoire? Avez-vous marché avec le code, et fonctionne-t-il sur d'autres machines? Peut-être qu'il se coince dans une boucle et fuit la mémoire jusqu'à ce qu'il se bloque?

Questions connexes