Pergunta

Estou usando o Profiler de memória Ants para tentar determinar por que o uso da memória do meu aplicativo continua a crescer.

Eu executo o aplicativo e tiro vários instantâneos ao longo do tempo. Vejo que as instâncias ao vivo do iwbemclassObjectFreethread e ManagementBaseObject continuam aumentando com o tempo. Olhando para o Explorer de Referência de Classe, posso ver que o IWBEMCLASSOBJETFREETHRADED é referenciado pelo ManagementBaseObject, e 100% dos ManagementBaseObjects são raízes GC, mas elas nunca parecem estar limpas. Quando mais posso fazer?

Foi útil?

Solução

Este é um problema incomum, mas pode acontecer. O WMI é baseado, o iwbemclassObject é uma interface com que recebe um invólucro RCW. Esses invólucros não são limpos até que o tópico do finalizador seja executado. É tecnicamente possível executar muitas consultas WMI, mas não fazer o trabalho suficiente com os resultados para que o coletor de lixo execute.

Diagnostique isso com perfmon.exe, monitor de desempenho. Clique com o botão direito do mouse no gráfico, adicione contadores, .NET CLR Memory e adicione o contador de coleções # Gen 0. Selecione seu programa na lista inferior. Observe o contador enquanto seu programa estiver em execução. Você terá esse problema se não estiver passando.

Se for esse o caso, revise seu código e verifique se ainda faz sentido executar tantas consultas, mas nunca ou raramente use os resultados. Uma solução alternativa é contá -los e todos, digamos, 100.000 vezes ligue para GC.Collect () e GC.WaitForPendingFinalizers ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top