Aumento do Tam. do Executável

03/03/2006

Olá Pessoal!

Estou enfrentando um problema sério de [b:0b3ab32e29]aumento de uso de memória[/b:0b3ab32e29] do meu aplicativo, e isso está me deixando [b:0b3ab32e29]preocupado[/b:0b3ab32e29]. Já ouvi falar bastante que [u:0b3ab32e29]não devemos destruir objetos[/u:0b3ab32e29] na mão com [u:0b3ab32e29]FreeAndNil[/u:0b3ab32e29] no momento de descarregar o objeto pai da memória (evento destroy) isso quem fica responsável é o objeto pai apartir do [b:0b3ab32e29]método Create(<NomeDoComponente>)[/b:0b3ab32e29] onde [b:0b3ab32e29]<NomeDoComponente>[/b:0b3ab32e29] seria o cara que limpa o objeto da memória. Bem, não sei se consegui me explicar direito mas como exemplo poderia destacar um form pai e um form filho. O form pai com uma chamada para o form filho [b:0b3ab32e29](este cheio de componentes)[/b:0b3ab32e29] onde a criação do form filho e feita no braço com create e não createform. Assim fiquei observando o tamanho do executável na memória pelo [b:0b3ab32e29]Task Manager do windows[/b:0b3ab32e29] e notei que a cada vez que abria o form filho o executável aumentava e quando fechava ele [b:0b3ab32e29]não diminuía[/b:0b3ab32e29]. Bem, gostaria então que alguém pudesse me responder se isso está certo ou se existe algum problema na maneira que estou programando. Obrigado pela atenção.[/b]


Edvilson.chaves

Respostas

03/03/2006

Massuda

...fiquei observando o tamanho do executável na memória pelo [b:e88fa43d21]Task Manager do windows[/b:e88fa43d21]
Por motivos técnicos, o Gerenciador de Tarefas não é a melhor forma de medir o consumo de memória do seu programa.

Na verdade, quando seu programa é encerrado, praticamente toda a memória que ele utilizou é liberada pelo sistema operacional.

Se quiser saber se seu programa está deixando para trás memória sem ser liberada, use, por exemplo, o [url=http://fastmm.sourceforge.net]FastMM[/url] (open source) em modo de debug.


Responder Citar

03/03/2006

Edvilson.chaves

Mas, Massuda e quando ao uso de memória enquanto o executável estiver rodando ao carregar um form e depois descarregá-lo o tamanho de memória deveria diminuir e isso não ocorre. Qual a prática que vc está utilizando, [b:9ec81ae112]eu olhei sobre o metodo Release[/b:9ec81ae112] ele foi criado para isso? E gostaria de saber realmente qual a melhor [b:9ec81ae112]prática[/b:9ec81ae112] para limpar a memória qdo eu fechar um form ou um datamodule (método Close).


Responder Citar

03/03/2006

Massuda

Imagino que você está afirmando isso baseado no que vê no Gerenciador de Tarefas.

Um dos motivos que a informação do Gerenciador de Tarefas estar errada é que um programa em Delphi aloca memória do Windows indiretamente; todo programa Delphi aloca memória através de um gerenciador de memória da Borland.

Em linha gerais, o gerenciador não devolve totalmente ao Windows a memória que você alocou porque ele imagina que você vai requisitar novamente mais memória. Isso é feito para otimizar os tempos de alocação de memória.

Um jeito simples de ver quanto de memória seu programa está efetivamente utilizando: coloque no seu form principal um timer e no evento OnTimer inclua o seguinte...
procedure TSeuForm.Timer1Timer(Sender: TObject);
var
  Blocos: Cardinal;
  Bytes: Cardinal;
begin
  Blocos := AllocMemCount;
  Bytes := AllocMemSize;
  Caption := Format(´¬s (¬d blocos - ¬d bytes)´, [Application.Title, Blocos, Bytes&93;)
end;



Responder Citar

06/08/2006

Raserafim

Massuda, coloquei o código que vc citou em meu aplicativo para ver como anda o consumo de memória, e aconteceu o seguinte.
crio todos os meus forms em tempo de execução
  Application.CreateForm(TFrmVendedores, FrmVendedores)
  FrmVendedores.Show;

e no OnClose dos forms coloco
Action := caFree.


observando o resultado com o seu código aconteceu o seguinte:
abro a aplicação: 22890 blocos | 1716272 bytes
abro cad clientes: 25962 blocos | 2055464 bytes
fecho cad clientes: 23679 blocos | 1876976 bytes
abro cad clientes: 25962 blocos | 2055476 bytes
fecho cad clientes: 23679 blocos | 1877049 bytes
abro cad clientes: 25962 blocos | 2054564 bytes
fecho cad clientes: 23679 blocos | 1876880 bytes

resumindo:
quando abro o cadastro de clientes o número de blocos vai sempre para o mesmo, e quando fecho também vai sempre para o mesmo.

o que posso tomar de conclusão disso? que está sendo destruido corretamente tudo o que foi criado? o que significa na verdade blocos?

com os bytes tem uma pequena variação mas não é sempre crescente. gira sempre em torno do mesmo valor, um pouquinho a mais ou um pouquinho a menos.

o que posso interpretar? o que significa realmente estes bytes? não deveria ocorrer o mesmo que os blocos, sendo sempre iguais?


Responder Citar

06/08/2006

Massuda

o que posso tomar de conclusão disso? que está sendo destruido corretamente tudo o que foi criado
Sim.

o que significa na verdade blocos?
Bloco é um bloco de bytes, a menor quantidade de bytes que o Delphi aloca; por exemplo, quando você aloca 4 bytes, o Delphi aloca um bloco, que pode corresponder (por exemplo) a 32 bytes.


Responder Citar

08/08/2006

Raserafim

e o que significa esta diferença de quando abro a aplicação (22890 blocos) para depois que abro e fecho o cadastro de clientes (23679 blocos)
não deveria voltar aos do início da aplicação?


Responder Citar

08/08/2006

Raserafim

analisando o gerenciador do windows (que vc já disse que não é aconselháve) a cada vez que abro e fecho o cadastro de clientes a quantidade de memória consumida vai cada vez mais aumentando.
devo desprezar esta análise e ficar só com o resultado do seu código?


Responder Citar

08/08/2006

Massuda

e o que significa esta diferença de quando abro a aplicação (22890 blocos) para depois que abro e fecho o cadastro de clientes (23679 blocos) não deveria voltar aos do início da aplicação?
Não necessariamente.

Vamos imaginar que quando inicia tem 100 blocos. Aí você abre algum form e precisa de mais 20 blocos... sua aplicação está usando 120 blocos. Quando você fecha o form, o Delphi pega os 20 blocos extras e ´marca´ eles como disponíveis; sua aplicação continua usando 120 blocos. Imagine que você abre outro form que precisa de 10 blocos; como tem 20 disponíveis, o Delphi não pede memória para o Windows, ele usa 10 dos 20 disponíveis.

analisando o gerenciador do windows (que vc já disse que não é aconselháve) a cada vez que abro e fecho o cadastro de clientes a quantidade de memória consumida vai cada vez mais aumentando. devo desprezar esta análise e ficar só com o resultado do seu código?
A grosso modo, o medidor do Windows mede o máximo de memória seu programa alocou, não o quanto ele está usando; para piorar a memória que é liberada de volta para o Windows mas não foi utilizada por outro aplicativo ainda aparece nesse total (essa memória disponível é considerada pelo Windows como disponível para uso pelo seu programa, embora ela possa ser usada por qualquer programa).

Por outro lado, o código que postei mede a quantidade de memória que foi alocada através do Delphi; ela não conta memória que eventualmente algum código seu aloque diretamente do Windows (via API).


Responder Citar

10/08/2006

Raserafim

explicado,

valeu massuda


Responder Citar