FastMM e Delphi 2006
Continuando um tema anteriormente publicado, neste artigo vamos começar a detectar os vazamentos de memória (memory leaks) existentes em nossos aplicativos. (isso se existirem, é claro…)
A partir do Delphi 2006 o gerenciador de memória padrão que acompanha o Delphi passa a ser o FastMM. Quem não trabalha com Delphi 2006 pode baixar o FastMM aqui.
Se você estiver começando agora a desenvolver com Delphi deve estar se perguntando: Tá, e dai? O que é memory leak?
Memory leak é um objeto criado pela aplicação que não foi corretamente destruído.
Você pode simular esta situação criando qualquer objeto no OnCreate do formulário principal da sua aplicação. Exemplo:
procedure TForm1.FormCreate(Sender: TObject);
var
lstVazamento : TStrings;
begin
lstVazamento := TStringList.Create;
try
lstVazamento.Add('Linha 1');
lstVazamento.Add('Linha 2');
lstVazamento.Add('Linha 3');
finally
end;
end;
Execute o aplicativo e feche-o. Você notará que não acontece nada!
Esse teste ridículo foi feito só para você ver como é comum ocorrerem problemas que resultem em vazamentos de memória (memory leaks) como a falta de atenção (nesse caso), a pressa, Control+C / Control+V entre alguns outros.
Agora insira esta linha logo após o begin da sua procedure:
ReportMemoryLeaksOnShutdown := True;
Deixando o código assim:
procedure TForm1.FormCreate(Sender: TObject);
var
lstVazamento : TStrings;
begin
ReportMemoryLeaksOnShutdown := True;
lstVazamento := TStringList.Create;
try
lstVazamento.Add('Linha 1');
lstVazamento.Add('Linha 2');
lstVazamento.Add('Linha 3');
finally
end;
end;
Repita a operação e veja o que acontece após fechar o aplicativo:
Veja que recebemos a notificação do TStringList que criamos e das 3 linhas que adicionamos (String x 3) a ele. A partir dai podemos começar a evitar esse tipo de erro na hora de desenvolvermos aplicativos.
Uma dica importante é você utilizar o bloco try…finally…end; sempre que criar um objeto dinamicamente. Isto evita que ocorra um erro no meio da execução e ele não seja destruído devidamente. Veja os dois exemplos:
Método não apropriado:
procedure TForm1.FormCreate(Sender: TObject);
var
lstVazamento : TStrings;
begin
ReportMemoryLeaksOnShutdown := True;
lstVazamento := TStringList.Create;
lstVazamento.Add('Linha 1');
lstVazamento.Add('Linha 2');
lstVazamento.Add('Linha 3');
lstVazamento.Free;
end;
Método apropridado de utilização:
procedure TForm1.FormCreate(Sender: TObject);
var
lstVazamento : TStrings;
begin
ReportMemoryLeaksOnShutdown := True;
lstVazamento := TStringList.Create;
try
lstVazamento.Add('Linha 1');
lstVazamento.Add('Linha 2');
lstVazamento.Add('Linha 3');
finally
lstVazamento.Free;
end;
end;
Utilizando o bloco try…finally…end; mesmo que ocorra algum erro na execução do procedimento o objeto é destruído. Pelo método não apropriado lstVazamento não seria destruído caso ocorresse algum problema na execução da linha lstVazamento.Add(‘Linha 1′);, por exemplo.
Em tempo: utilizando ReportMemoryLeaksOnShutdown := True; a mensagem ocorrerá sempre que o aplicativo for terminado, inclusive fora do Delphi. Para evitarmos esse situação, substitua o True por DebugHook <> 0; deixando a linha assim:
ReportMemoryLeaksOnShutdown := DebugHook <> 0;
Para quem utiliza outras versões do Delphi isto deve ser configurado no arquivo FastMM4Options.inc.
No próximo artigo abordaremos mais funções do FastMM e configurações do arquivo FastMM4Options.inc para quem utiliza FastMM em versões mais antigas do Delphi. Até mais!
Em 22 de fevereiro de 2007 às 16:47
Já tentei utilizar o FastMM com o Delphi 6 mas na hora de debugar (com o F7) acabava debugando também as funções do FastMM… Bom pode ser que eu tenha feito besteira. O que interessa é que eu percebi uma leve diferença no consumo de memória e no tamnaho do executavel.
Em 20 de janeiro de 2008 às 13:24
Como posso instalar o FastMM para o Delphi 7!
Se alguem possuir um passo-a-passo ficarei agradecido!
Obrigado amigos..
Abraço
Em 15 de abril de 2008 às 18:07
Estou utilizando o delphi 2006 em um projeto e preciso saber como utilizar o FastMM para encontrar vazamento de memoria em aplicações que rodam como Serviço do Windows. caso possa me auxiliar sou grato…
Em 13 de junho de 2008 às 15:10
estou precisando de um livro sobre o delphi 2006, nem uma loja vende este livro, alguem pode mim ajudar?
Em 16 de fevereiro de 2009 às 21:53
Boa noite Tarcisio ,
também preciso dessa apostila para o delphi 2006 , não encontro em lugar algum você conseguiu alguma coisa que possa estar me enviando ?
aguardo sua resposta.
–
Obrigado.
Em 07 de julho de 2008 às 14:07
tendo o delphi 2006 garbage collection, dificilmente teremos vazamento de leak, faz mais sentido usar o fastmm no delohi 7 q nao tem GC. ou estou errado?
Em 11 de setembro de 2009 às 11:23
Correto, as ultimas versoes do Delphi ja nao trazem esse problema de vazamento de memoria nao, o proprio compilador corrige isso, basta fazer uma consulta nos manuais do delphi, a partir das versoes 2006. Se isso acontece, com certeza a Microssoft, ja teria caido matando em cima dos produtos da Borland.