O que são memory leaks e quais suas consequências?

Um memory leak (ou vazamento de memória) acontece quando sua aplicação aloca um espaço na memória e nunca mais o libera.

Como os memory leaks acontecem em Delphi

Em uma aplicação Delphi, espaços de memória são alocados e liberados o tempo todo. Muitas vezes isso é feito automaticamente pelo compilador ou pela RTL – por exemplo, ao alocar variáveis de tipos primitivos, parâmetros que são passados a funções, etc. – e não precisamos nos preocupar com isso.

Porém, existem muitos casos em que nós alocamos memória manualmente. Um dos mais comuns acontece ao instanciar um objeto:

Obj := TMyObject.Create;

A linha de código acima irá alocar um espaço de memória e a variável Obj irá apontar para esse endereço alocado. Para liberar o espaço, pode-se usar o método Free:

Obj.Free;

Se o desenvolvedor esquecer de chamar o método Free, o espaço de memória associado ao objeto nunca é liberado. Temos um memory leak.

Consequências dos memory leaks

Você pode se perguntar: "Qual o problema? Já vi isso acontecer na minha aplicação e nunca tive nenhum problema prático!".

Realmente, em geral, não se sente muito os efeitos, quando são poucos memory leaks. Mas as consequências tem intensidades diferentes dependendo do tipo de aplicação.

Aplicações no cliente (desktop ou mobile)

Em geral, em aplicações desktop ou mobile, o efeito não é muito grave. Nos sistemas operacionais atuais, em geral a memória alocada pela aplicação é liberada quando a aplicação é encerrada, de modo a não causar instabilidade no sistema.

Mesmo assim, se sua aplicação gera muitos memory leaks, podem acontecer alguns problemas, causados pelo uso excessivo da memória:

  • Lentidão da aplicação e/ou do sistema: Acesso a disco pode ser necessário pra contornar a falta de memória.

  • Fechamento abrupto da aplicação: O sistema operacional pode forçar a finalização do sistema devido ao uso excessivo de memória. Isso é mais comum em aplicações mobile.

  • Bugs no sistema: Partes do sistema que alocam memória podem começar a falhar e causar bugs.

Aplicações no servidor

Quando se fala em aplicativos servidores, o problema fica pior. Isso porque idealmente você nunca irá fechar o servidor – você quer que ele rode para "sempre", sem se incomodar.

As consequências são praticamente as mesmas das aplicações desktop, mas como teoricamente o servidor nunca fecha, qualquer pequeno memory leak terá consequências futuramente. A memória será lentamente consumida ao longo de dias, semanas, meses, e seu servidor começará a apresentar lentidão, bugs e eventualmente irá parar de funcionar.

Como evitar os memory leaks

Existem técnicas e ferramentas para lhe ajudar a detectar e remover os memory leaks da sua aplicação. Isso será abordado em posts futuros.

E você? Já sentiu teve problemas com memory leaks na sua aplicação? Ou considera um item de baixa prioridade e tem coisas mais importantes pra se preocupar no seu código? Deixe seu comentário!

8 comentários em “O que são memory leaks e quais suas consequências?”

  1. Muito bom o post. Realmente a falta de cuidado e um projeto sem considerar o memory management vai acabar dando uma enorme dor de cabeca, e depois para encontrar é talvez mais demorado do que se tivesse sido feito correto do inicio !

    • Memory leaks não vem só de objetos criados e não destruídos, tem várias outras coisas que podem causar. Infelizmente o programador precisa ter conhecimento dessas coisas – referencias circulares em interfaces, por exemplo, alocação de ponteiros… Usar ferramentas pra detecção de memory leaks é algo que ajuda muito e tira o peso de ter que “programar certo” o tempo todo.

  2. Excelente artigo. Nossos sistemas são 100% livres de memory leaks. Começamos esse tipo de controle há mais de 15 anos e, desde então, é uma exigência. Não liberamos nenhuma nova versão com essa “doença”.

Deixe um comentário