fpWeb: Verificando Vazamentos de Memória


A linguagem Object Pascal, assim como C ou C++, não possui Garbage Collector para liberar os objetos e recursos da memória automaticamente. Pode ser difícil ter 100% de certeza que todos os objetos estão sendo liberados (manualmente) pelo código. Mas, se algum objeto não for liberado, ocorrerá um vazamento de memória.

Unsplash image Photo by Steve Johnson on Unsplash

Quando utilizamos a linguagem Object Pascal precisamos nos preocupar com vazamentos de memória, até mesmo nos sistemas mais simples.

Vazamentos de memória podem ser ainda mais prejudiciais em sistemas Web comparado com sistemas Desktop. Se uma aplicação Desktop tem vazamentos de memória, em algum momento o usuário poderá fechar a aplicação e todo o vazamento será recuperado pelo Sistema Operacional. Mas em aplicações Web, onde podem haver múltiplas requisições por segundo enquanto o servidor mantém em memória cópias do executável (FastCGI), tais vazamentos poderiam diminuir drasticamente com os recursos do servidor.

No artigo anterior fizemos um programa simples que responde “Hello!” quando uma determinada URL acessada.

Como não há vazamentos de memória nesse programa, teremos que simulá-lo, alterando o método HandleRequest conforme abaixo:

procedure THelloRoute.HandleRequest(
  ARequest: TRequest; AResponse: TResponse);
begin
  TStringList.Create;
  AResponse.Content := 'Hello!';
  AResponse.SendResponse;
end;

Mesmo após compilar o programa com o HeapTrc habilitado, iniciá-lo e executá-lo utilizando o browser, não será possível ver o vazamento — diferentemente de aplicações Desktop que, ao término do programa, mostra um “relatório” sobre a memória utilizada vs. liberada.

Para ser possível ver o relatório, você tem que finalizar a aplicação apropriadamente. O problema é que, mesmo após finalizada a requisição pelo browser, ela continua em execução aguardando mais e mais requisições.

Felizmente, há uma maneira de ver o relatório do HeapTrc, alterando o código conforme a seguir:

No código acima, foi introduzido um procedimento TerminateCall, algumas configurações do heaptrc e a inclusão de uma nova rota /quit.

Compile e execute a aplicação novamente. Depois, faça uma requisição a URL /hello.

Então, aponte seu browser para fazer uma requisição a URL /quit. Nesse momento você verá que a janela da aplicação foi finalizada.

Finalmente, abra o arquivo log.txt, localizado no mesmo diretório do executável, para visualizar todos os vazamentos de memória.

Até logo.

Posts Relacionados

  • Memória Segura Utilizando Instâncias de Interfaces

  • Classes Mutáveis vs Objetos Imutáveis

  • Implementando Interfaces Utilizando Diferente Assinaturas de Métodos

  • Usando Paths ao invés de Diretivas de Compilação

  • Trabalhando com Exceções em Requisições HTTP

  • Tipo object Continua Vivo

  • Array de Objetos

  • Variáveis Locais Deveriam ter Nomes Curtos

  • Como Dividir e Organizar o Código em Formulários com Muitos Widgets

  • Pascal Deveria ser Modernizado?