obtenir occasionnellement des exceptions OutOfMemory à partir d'une application .NET occupée
La réponse à cette question est trop complexe pour tenir dans une réponse. Voir « Optimisation des performances des applications .NET » pour un traitement complet du sujet.
Voici un résumé largement simplifié (mais toujours assez bon) de Bruno Jouhier :
De plus, le runtime .NET ne vous laisse pas aller jusqu'à 2 Go. Le garbage collector fonctionne en copiant des objets vivants, il a donc besoin d'une bonne quantité d'espace pour effectuer ses copies.
Éditer:
Voici ma tentative d'explication ...
Si vous vous demandez quelle est la taille maximale de la mémoire du processus de travail (telle que rapportée par le Gestionnaire des tâches) pour un processus de travail ASP.NET sur x86, la réponse est "cela dépend" .
Dans tout type de code managé tel que Java ou .NET, le programmeur abandonne le contrôle fin de la mémoire comme pénitence pour ne pas avoir à traiter avec des pointeurs. Lors de l'exécution d'un programme, le tas et la pile sont nettoyés périodiquement par le garbage collector .
En ce qui concerne spécifiquement ASP.NET, le garbage collector s'exécute à l'intérieur du même processus de travail que le site Web. Le GC consomme sa propre mémoire. La quantité de mémoire est entièrement fonction de la façon dont le code de votre application est écrit. Une application peut utiliser 1,8 Go de mémoire tandis qu'une autre peut s'étouffer à 500 Mo. Pour comprendre pourquoi , vous devez profiler votre application spécifique.
Tout processus sur un système d'exploitation Windows x86 est limité à 2 Go, sauf si vous avez défini le commutateur / 3 Go dans votre fichier boot.ini, auquel cas un processus peut utiliser 3 Go.
la source
De cet article de blog "Recommandations pour les paramètres du pool d'applications SharePoint" :
D'après mon expérience, 800 Mo est le seuil pour les machines 32 bits (2-4 Go de RAM). Il recycle les pools d'applications avant de lever les exceptions de «mémoire insuffisante».
la source
Assurez-vous que vous ne définissez pas la taille de la mémoire virtuelle sur votre pool d'applications. Si vous définissez cette valeur sur un nombre en dehors de la plage autorisée, elle reviendra à 512 Mo. Voir KB923197 .
Notez également que si vous exécutez une application ASP.Net, ASP.Net recyclera le pool à 60% de la limite de mémoire de 2 Go, soit 1,2 Go. Ce n'est pas votre scénario ~ 500, mais sur les pools d'applications 32 bits avec une grande utilisation de la mémoire, nous tweekons parfois cela pour obtenir un peu plus de mémoire.
la source
Sous Windows 2003, vous pouvez définir l' extension d'allocation physique (PAE) pour utiliser toute la mémoire. La mémoire par défaut pour un apppool IIS6 est 5MB .
la source