2008-10-27 2 views
2

J'ai plusieurs instances d'une application installée sur une boîte IIS 6.0, Windows Server 2003 sous le même pool d'applications. Ils partagent plusieurs des mêmes assemblées et ne peuvent pas être joints à une seule application.Le GAC va-t-il corriger une exception System.OutOfMemoryException ASP.NET/IIS6.0?

J'ai récemment ajouté une nouvelle instance de l'application et obtenu une exception System.OutOfMemoryException lorsque j'ai essayé de charger l'application ASP.NET 2.0.

L'utilisation du GAC pour stocker des assemblages communs corrige-t-elle cette erreur ou peut-elle être corrigée en espaçant les sites entre différents pools d'applications?

Répondre

1

Mettre quelque chose dans le GAC change seulement l'emplacement physique de la DLL (et les paramètres de sécurité), il ne change pas ce qui est chargé dans la mémoire.

La plupart des gens ont tendance à penser que le GAC est «là où Microsoft place ses affaires». Je n'ai pas vu beaucoup d'applications créées par "tout le monde" qui peuvent justifier l'utilisation du GAC.

Vous devriez probablement commencer à penser à une solution d'équilibrage de charge qui met une pression de RAM importante sur votre machine.

+0

Le bélier n'est pas du tout maxi. Il semble que seul le pool d'applications est en train de devenir stressé. Malheureusement, je n'ai pas remarqué de zone pour voir quelle est l'utilisation actuelle de la RAM et la limite d'un pool d'applications. –

1

Assurez-vous que vous avez le déploiement de détail = « true » situé dans le Machine.Config:

<system.web> 
    <!-- 
     <deployment 
      retail = "false" [true|false] 
     /> 
    --> 
    <deployment retail="true" /> 
</system.web> 

code de débogage prend beaucoup plus de mémoire puis non-débogage et la compilation dans des ensembles simples au lieu d'une par page réduira la surcharge mémoire des charges d'assemblage.

Assurez-vous que vous êtes les paramètres de mémoire sur vos pools d'applications sont suffisamment élevées, et vous pourriez aussi jeter un oeil à la mise ProcessModel MemoryLimit: http://msdn.microsoft.com/en-us/library/7w2sway1(VS.71).aspx

Et essayez d'utiliser 80% ou 85% paramètre:

<processModel 
    memoryLimit="80" 
/> 
+0

Quelqu'un peut-il nous dire si ProcessModel memoryLimit s'applique à tous les processus * .Net, ou seulement à ASP.Net? – tbone

+0

"processModel" est pour ASP.Net seulement, je crois: http://msdn.microsoft.com/en-us/library/7w2sway1(VS.71).aspx –

0

La mise en place d'un assembly partagé dans le GAC économise de l'espace disque, par ex. si vous avez 20 applications asp qui utilisent la même DLL. Il se peut que vous chargiez moins de copies de la même DLL dans la mémoire, je ne suis pas sûr. Cela dit, les erreurs OutOfMemoryErrors sont plus susceptibles d'être causées par le chargement de très gros objets dans la mémoire, un exemple typique est un DataSet. Les assemblages sont petits par rapport à la mémoire que vous pouvez manger avec de grands jeux de données ou de gros fichiers xml en mémoire.