Nous voyons beaucoup de fragmentation de la mémoire virtuelle et des erreurs de mémoire insuffisante, puis elle atteint la limite de 3 Go.
Le débogage de la compilation est défini sur true dans le web.config, mais j'obtiens des réponses différentes de toutes les personnes à qui je pose la question.
Scott Guthrie (manager de l'équipe de développement ASP.NET) a un article intéressant à ce sujet .
Les points les plus importants pour lesquels vous ne devriez pas quitter debug="true"
sont:
- La compilation des pages ASP.NET prend plus de temps (car certaines optimisations par lots sont désactivées)
- Le code peut s'exécuter plus lentement (car certains chemins de débogage supplémentaires sont activés)
- Beaucoup plus de mémoire est utilisée dans l'application au moment de l'exécution
- Les scripts et les images téléchargés à partir du gestionnaire WebResources.axd ne sont pas mis en cache par le navigateur, ce qui entraîne davantage de demandes entre le client et le serveur
Il mentionne également le drapeau <deployment retail=”true”/
> dans machine.config, ce qui permet de remplacer globalement l'indicateur debug = "true" de toutes les applications exécutées sur une machine (par exemple sur un serveur de production).
Mise à jour : déploiement d'applications Web avec debug="true"
est toujours mauvais, comme vous pouvez le lire dans récent article de blog de Scott Hanselman :
Voici pourquoi debug = "true" est mauvais. Sérieusement, nous ne plaisantons pas.
- Remplace le délai d'exécution de la demande, ce qui le rend effectivement infini
- Désactive les optimisations de page et de compilateur JIT
- En 1.1, conduit à une utilisation excessive de la mémoire par le CLR pour le suivi des informations de débogage
- Dans la version 1.1, désactive la compilation par lots de pages dynamiques, conduisant à 1 assembly par page.
- Pour le code VB.NET, conduit à une utilisation excessive de WeakReferences (utilisé pour modifier et continuer le support).
Une note importante: Contrairement à ce que l'on croit parfois, mettre retail = "true" dans un élément n'est pas un antidote direct à avoir debug = "true"!
L'indicateur de débogage doit être défini sur false dans web.config, sauf si vous devez réellement déboguer l'application.
L'exécution en mode débogage peut augmenter quelque peu l'utilisation de la mémoire, mais ce n'est probablement pas le cas aussi grave que vous en parlez. Cependant, vous devez le définir sur false pour éliminer l'effet qu'il a et voir si vous pouvez remarquer une amélioration.
Lorsqu'il est exécuté en mode débogage, le garbage collection fonctionne différemment. La durée de vie des variables est étendue de son utilisation réelle à la portée de la variable (pour pouvoir afficher la valeur dans le débogueur). Certains objets vivent ainsi plus longtemps avant d'être récupérés.
Le compilateur n'optimise pas le code lors de la compilation en mode débogage, et également quelques instructions nop
supplémentaires sont ajoutées afin que chaque ligne de code ait au moins une instruction où un point d'arrêt peut être placé.
Lancer une exception prend beaucoup plus de temps en mode débogage. (Cependant, normalement, le code ne doit pas lever d'exceptions aussi souvent.)
Cela pourrait absolument affecter la mémoire, jetez un œil à certains des compteurs de perfmon et effectuez une comparaison avec les deux configurations.
Si votre site contient beaucoup de fichiers, je serais plus concerné par le disque io dans le dossier temporaire asp.net.
Questions de couple ...
Pourquoi ne pas utiliser plusieurs configurations?
Web.Debug.Config - Activer le débogage Web.UAT.Config - Quelle que soit votre préférence Web.Release.Config - Désactiver le débogage
De cette façon, vous pouvez minimiser les erreurs de configuration de régression comme un développeur vérifiant un fichier web.config avec debug = "true"
AFAIK "debug = true" ne provoque pas la situation que vous avez mentionnée.
J'avais rencontré le même problème avec une application ASP.NET qui créait des images à la volée.
donc je pense que vous avez un problème avec les ressources non éliminées.
Si vous déployez vos fichiers aspx avec des fichiers code-behind sur le serveur. Il sera compilé une fois lorsque la demande parviendra à un aspx. il sera ensuite stocké dans le cache jusqu'à ce que le fichier change.
Sur les systèmes de production, définissez toujours Debug = false. Comme l'indique l'indicateur, il ne doit être défini sur true que lors du débogage d'un système de développement.
Cet indicateur n'a rien à voir avec votre problème de fragmentation de la mémoire.