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!