none
Garbage Collector não funciona em alguns ambientes RRS feed

  • Pergunta

  • Olá pessoal, td bem?

    Recentemente estou enfrentando um problema bem peculiar quanto ao Garbage Collector.

    Vou tentar resumir a história aqui...

    Tenho um sistema EPR feito em C#. Um cliente deste sistema começou a reclamar que depois de usa-lo por um tempo durante o dia, carregando diversas telas e diversos registros, o mesmo começa a disparar uma exceção de Out of Memory, mais especificamente do tipo OutOfMemoryException.

    Essa reclamação já vem de um tempo, e desde então, começamos a acompanhar o consumo de memória do nosso ERP através do gerenciador de tarefas do próprio Windows.

    FATO 1: A configuração da máquina em que acontece o problema é um desktop Dell, Windows 7 32bit Pro, 3Gb de RAM, Intel

    FATO 2: Percebemos que a exceção só acontece depois que a aplicação atinge mais de 1Gb de memoria consumido... Mesmo as telas que estavam abertas neste terminal sendo fechadas, dá a impressão que o GC não coleta o "lixo", pois o consumo de memória nunca abaixa, mesmo depois de um bom tempo parado.

    FATO 3: O mais intrigante disso tudo é outras máquinas deste mesmo cliente, esta exceção não acontece. E simulando o mendo cenário da máquina problemática, pude perceber que o GC entrou em ação e coletou os "lixos" das telas que não estavam mais abertas.

    FATO 4: Internamente, aqui em ambiente de desenvolvimento, nós criamos uma Maquina Virtual com a mesma configuração das máquinas problemáticas do cliente para poder simular o cenário, e aqui, pudemos perceber que o GC também funciona normalmente, limpando a memória NÃO utilizada depois de que as telas são fechadas.

    Por isso tudo, demos o titulo deste post como "GC não funciona em alguns ambientes". Será que isso faz sentido? Alguém já viu algo parecido?

    Enfim pessoal, se algum tiver alguma dica iria ajudar bastante.

    Muito obrigado por enquanto.

    André


    André P. Bertoletti

    sexta-feira, 1 de agosto de 2014 14:06

Todas as Respostas

  • Testa fazer algumas alterações no código para elementos gerenciáveis, SQLConnection, MemoryStream e etc....

    using(SQLConnection con = new SQLConnection())

    {

    }

    para os demais que possam estar dentro do "using", chame o método objeto.Dispose();por exemplo

    using(SQLConnection con = new SQLConnection())

    {

    SQLCommand command = new SQLCommand(con);

    //Seu uso e terminando

    command.Dispose();

    }

    Se você usa um objeto em vários lugares, tente passar por referência no lugar de criar várias instancias.

    sexta-feira, 1 de agosto de 2014 15:07
  • Só completando a excelente sugestão do Cesar, quando utilizamos o "using" os objetos instanciados com ele (SqlConnection por exemplo) são destruídos em seguida, ou seja, se não resolver por completo, vai pelo menos diminuir esses exception!!!

    Abraço!!!

    Diego de O. Neves |Analista Desenvolvedor .NET
    Microsoft MCP | ITIL® V3 Foundation 


    sexta-feira, 1 de agosto de 2014 16:27
  • @André P. Bertoletti,

    Um ERP pode demandar milhares de horas de desenvolvimento de X desenvolvedores, na qual cada um com suas habilidades de desenvolvimento.

    Testes unitários, dependendo de como foram feitos, não seriam capazes de identificar essa falha, na qual não trata-se de um falha do GC, e sim de um código na qual não houve um gerenciamento de memória.

    Li um artigo que mostra basicamente a sua situação, dê uma olhada.


    Se a sugestão resolver o problema, favor marcar como Resposta.

    sexta-feira, 1 de agosto de 2014 17:05