Possível fuga de memória no código da aplicação Web

Microsoft.Windows.InternetInformationServices.6.2.ApplicationPool.MemoryLeak.Monitor (UnitMonitor)

Este monitor analisa os eventos registados quando o conjunto aplicacional é reciclado por ultrapassar os limiares de memória configurados e irá mudar o seu estado para aviso se o conjunto aplicacional for reciclado com demasiada frequência (com base na configuração do monitor). Este é um monitor de reposição manual, o que significa que não irá mudar automaticamente para um bom estado de funcionamento. Para mudar o monitor para um bom estado de funcionamento, será necessário repor o monitor utilizando o explorador do estado de funcionamento.

Knowledge Base article:

Resumo

O conjunto aplicacional é reciclado com demasiada frequência porque o consumo de memória virtual ou física atingiu o limite configurado. Esta situação pode indicar uma fuga de memória no código que o conjunto aplicacional está a executar.

Configuração

Este monitor funciona procurando uma série de eventos de reciclagem do conjunto aplicacional por ter atingido o limiar de utilização de memória configurado (este valor é configurado nas ferramentas Admin do IIS). Pode configurar dois parâmetros neste monitor. O primeiro é "Número de Ocorrências", ou seja, o número de vezes que os eventos que o monitor procura têm de ocorrer no intervalo de tempo configurado. O segundo parâmetro é "Número de Minutos", ou seja, o intervalo de tempo durante o qual o monitor procura pelas ocorrências dos eventos.

Causas

Resoluções

Para verificar ou configurar as definições de limite do conjunto aplicacional utilizando o Gestor de IIS:

Nota: uma vez que este é um monitor de reposição manual, depois de resolver o problema terá de repor o estado deste monitor no explorador do estado de funcionamento. Pode fazê-lo clicando no monitor com o botão direito do rato e selecionando o item de menu "Repor Estado de Funcionamento". A não ser que reponha manualmente o monitor, o respetivo estado de funcionamento não voltará ao normal.

Element properties:

TargetMicrosoft.Windows.InternetInformationServices.6.2.ApplicationPool
Parent MonitorSystem.Health.AvailabilityState
CategoryAvailabilityHealth
EnabledTrue
Alert GenerateTrue
Alert SeverityWarning
Alert PriorityNormal
Alert Auto ResolveTrue
Monitor TypeMicrosoft.Windows.InternetInformationServices.6.2.RepeatedEventLogManualReset2StateMonitorType
RemotableTrue
AccessibilityPublic
Alert Message
Possível fuga de memória no código da aplicação Web
O Conjunto Aplicacional {0} no servidor {1} foi reiniciado várias vezes por ultrapassar os limiares de memória especificados para este conjunto aplicacional. Esta situação pode indicar uma fuga de memória dentro do código da aplicação Web.
RunAsDefault

Source Code:

<UnitMonitor ID="Microsoft.Windows.InternetInformationServices.6.2.ApplicationPool.MemoryLeak.Monitor" Accessibility="Public" Enabled="true" Target="Microsoft.Windows.InternetInformationServices.6.2.ApplicationPool" ParentMonitorID="SystemHealth!System.Health.AvailabilityState" Remotable="true" Priority="Normal" TypeID="Microsoft.Windows.InternetInformationServices.6.2.RepeatedEventLogManualReset2StateMonitorType" ConfirmDelivery="false">
<Category>AvailabilityHealth</Category>
<AlertSettings AlertMessage="Microsoft.Windows.InternetInformationServices.6.2.ApplicationPool.MemoryLeak.Monitor_AlertMessageResourceID">
<AlertOnState>Warning</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>Normal</AlertPriority>
<AlertSeverity>Warning</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Target/Property[Type="IISCommon!Microsoft.Windows.InternetInformationServices.ApplicationPool"]/PoolID$</AlertParameter1>
<AlertParameter2>$Target/Host/Host/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</AlertParameter2>
</AlertParameters>
</AlertSettings>
<OperationalStates>
<OperationalState ID="PotentialMemoryLeakDetected" MonitorTypeStateID="RepeatedEventRaised" HealthState="Warning"/>
<OperationalState ID="Healthy" MonitorTypeStateID="ManualResetEventRaised" HealthState="Success"/>
</OperationalStates>
<Configuration>
<RepeatedComputerName>$Target/Host/Host/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</RepeatedComputerName>
<RepeatedLogName>System</RepeatedLogName>
<RepeatedExpression>
<And>
<Expression>
<RegExExpression>
<ValueExpression>
<XPathQuery Type="UnsignedInteger">EventDisplayNumber</XPathQuery>
</ValueExpression>
<Operator>MatchesRegularExpression</Operator>
<Pattern>^(5117|5077)$</Pattern>
</RegExExpression>
</Expression>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">PublisherName</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="String">Microsoft-Windows-WAS</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">Params/Param[2]</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="String">$Target/Property[Type="IISCommon!Microsoft.Windows.InternetInformationServices.ApplicationPool"]/PoolID$</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
</And>
</RepeatedExpression>
<NumberOfSeconds>3600</NumberOfSeconds>
<NumberOfOccurrences>10</NumberOfOccurrences>
</Configuration>
</UnitMonitor>