Nous testons donc une application ASP.NET développée par une société externe. Nous recevons environ 50 requêtes par seconde et, après une demi-heure, chacun des 48 processus de travail (w3wp.exe) a atteint environ 400 Mo et plus. Le système fonctionne sous IIS7.
Après avoir manipulé dotTrace, je suis presque certain qu'il y a une fuite de mémoire, mais il est difficile d'en être sûr à 100% sans connaître l'application. Lorsque nous avons confronté les développeurs à cette théorie, ils l'ont rejetée après 30 secondes en disant quelque chose comme "la mémoire est gérée automatiquement dans .NET". .NET aurait certainement collecté 48x~400MB s'il s'agissait de données finalisées ?
De toute façon, j'ai l'habitude de travailler avec WinForms. Comment exactement créer des fuites de mémoire en ASP.NET ? Le seul moyen est-il d'utiliser (mal) les objets Application et Session dans .NET ?
modifier
Depuis que j'ai posté cette question, j'ai appris que le fait de conserver des références statiques à des objets dans les gestionnaires de requêtes (qu'il s'agisse d'une classe de service Web, d'un formulaire Web ou autre) entraîne des "fuites". Ce n'est probablement pas le terme exact, mais bon... Je n'étais pas sûr de cela, car je pensais que les classes de gestionnaires étaient détruites et recréées après chaque requête par IIS.
Alors codez comme ceci :
public class SomeService : IService
{
public static List<RequestData> _requestDataHistory = new List<RequestData>();
public void SomeRequest(RequestData data)
{
_requestDataHistory.Add(data);
}
}
fera planter votre serveur tôt ou tard. Peut-être que cela était évident pour la plupart des gens, mais pas pour moi :-)
Je ne sais toujours pas si cela poserait un problème si vous supprimiez le mot-clé statique. Est-ce que instances éliminé après chaque demande ?