2010-11-26 3 views
0

J'ai un panneau de mise à jour combiné avec gridview avec tri et pagination.IIS + Ajax UpdatePanel entraîne une utilisation extrême de la mémoire

je vais dans le gestionnaire de tâches pour surveiller l'utilisation de la mémoire du processus de travail (w3wp)

Ce que je fais est juste de cliquer sur les boutons de tri rapide.

Avec chaque clic la mémoire du processus augmente avec environ 2 mb

je vais donc de l'utilisation de la mémoire 30 Mo à environ 90. Ensuite, il arrête à reste là, pas de mémoire est libéré. Je n'utilise pas la mise en cache ou l'état de session/application.

Quelle est la cause de ce problème, y a-t-il un paramètre dans IIS pour réduire l'utilisation de mem?

-

J'ai aussi utilisé .net profileur pour examiner mon utilisation de la mémoire de l'application: 4 mb, alors quel est l'autre 86 pour ??? il utilisé Même si elle enregistre 4 Mo, dans le gestionnaire de tâches, elle indique 90 Mo, ce qui m'amène à croire que le reste est de la mémoire non-managée qui doit être utilisée par IIS d'une manière ou d'une autre.

+0

BTW ce n'est pas seulement un problème d'ajax. J'ai testé cela avec d'autres sites et la mémoire monte également de la même manière, mais pas aussi abruptement. Laissez dire 400 - 500 kb par demande. – Tomasi

+0

A fait un test, pas d'état de session, pas de viewstate, pas de serveur sql, juste un fichier xml un gridview et un updatepanel. L'utilisation de la mémoire va de 20 à 70 et ne revient pas en bas: http://rapidshare.com/files/433269321/ajaxtest.rar – Tomasi

+0

plz quelqu'un tester le projet que j'ai posté, c'est un issiue – Tomasi

Répondre

0

Le problème est en fait avec le GridView, et non le UpdatePanel. Ses enregistrements sont stockés dans votre ViewState, de sorte qu'il est transmis d'avant en arrière à chaque publication. En outre, lorsque vous cliquez rapidement sur les boutons de tri, vous générez plusieurs demandes de tri des données. En fonction de la manière dont votre tri est implémenté, vous pouvez dupliquer le jeu d'enregistrements pour le tri à chaque demande de clic.

Il n'existe aucun paramètre dans IIS pour "réduire l'utilisation de la mémoire" car il héberge simplement votre application ASP.NET. Votre application doit résoudre ses propres problèmes de mémoire.

Le tri d'une grande quantité de données peut être un processus gourmand en ressources. Je dirais que votre meilleur pari est de désactiver le bouton de tri après qu'il a été cliqué et de le réactiver une fois que vos données ont été triées.

+0

utilisé profiler pour examiner mon application. utilisation de la mémoire: 4 Mo, alors quel est l'autre 86 utilisé pour ??? – Tomasi

+0

ViewState ne consomme pas de mémoire sur le serveur. À moins que vous ayez une gestion ViewState personnalisée qui déplace le ViewState en mémoire, vous ne devriez pas voir une augmentation de la consommation de mémoire constante due à ViewState. – Stilgar

+1

@diamandiev Le GridView stocke ses données en interne dans ViewState, à moins que vous ne le spécifiiez explicitement, mais que vous ne puissiez pas trier. @Stilgar ViewState ne gère pas la mémoire sur le serveur comme le fait Session, mais lors d'une publication, ViewState est renvoyé avec la requête. Pour accéder à ViewState de la requête, il est stocké en mémoire pendant la durée de la requête. – bitxwise

0

Le GC .NET est non-déterministe. Cela signifie qu'il fonctionnera chaque fois qu'il décidera qu'il devrait fonctionner. Vous pouvez essayer d'appeler GC.Collect() explicitement par exemple dans l'événement Page_Init pour voir si la mémoire augmente encore, mais vous feriez mieux de le retirer de la vraie application sinon vous empêchez simplement le GC de faire son travail efficacement.

+0

J'ai fait ce que vous avez suggéré et l'utilisation de la mémoire a été réduite de moitié. Mais pourquoi le garbage collector n'efface-t-il pas la mémoire après la fin de chaque requête? - – Tomasi

+0

Parce que le CPG ne fonctionne pas constamment, seulement quand cela lui convient. Mais vous pouvez forcer une collection si vous voulez vraiment juste comme les mentions de poste. – JonVD

+0

Est-ce qu'un module qui gère l'événement Application.EndRequest et appelle GC.Collect() est une bonne idée? – Tomasi

Questions connexes