Fórum Aplicação consumindo memória #333465

22/11/2006

0

Boa tarde,

Desenvolvi uma aplicação que faz a leitura de uma tabela do banco de dados a cada 10 segundos e conforme a informação encontrada executa um processo que gera um arquivo .bat, esta aplicação fica rodando em um servidor e na primeira vez que o programa é carregado ocupa 8k de memória. Após uma semana em execução a quantidade passa de 8 para 520k. Alguém sabe como identificar o que esta ocasionando o consumo da memória, será que é a rotina que faz a leitura no banco?
Vi aqui no fórum que não é aconselhável ficar desativando e ativando a conexão com o banco de dados.

Obrigado

Airton


Airoosp

Airoosp

Responder

Posts

23/11/2006

Aerreira

Bom, apesar de não saber exatamente do que se trata, nem qual banco está usando, você deve sim fechar sua conexão com o banco a cada final de processamento, ou seja, ao final do seu processo que se repete a cada 10 segundos, feche todas as conexões que houverem, e ao iniciar abra novamente.

Mas ao meu ver esse não é o seu problema, que na verdade em algum ponto de sua aplicação você criou ou instanciou algum objeto e não o liberou da memória após seu uso. Por menor que seja, com o tempo (você citou uma semana) acaba crescendo bastante.

Imagine um processo qualquer que ´esqueça´ 10 bytes na memória e que seja executado a cada 10 segundos durante uma semana, fazendo as contas o processo terá executado por 60480 vezes, 10 bytes cada vez que ficarão acumulados na memória, terá 604800 bytes, ou seja, 590k.

O duro é descobrir o que está largando esse rastro....


Responder

Gostei + 0

23/11/2006

Airoosp

Bom dia,

A aplicação foi desenvolvida no Delphi 6 e acessa banco Oracle 8.1.7, funciona da seguinte forma:

Ao executar o aplicativo é feita a conexão com o banco de dados e habilitado o evento timer que é executado a cada 10 segundos, fazendo uma pesquisa em uma tabela do banco.
Caso o conteúdo de um campo seja S, os dados retornados no select são utilizados na criação de um arquivo .bat que é executado pela aplicação.
O objetivo da aplicação é ficar monitorando a tabela e criar o arquivo .bat conforme condição descrita acima.
Entendi o que você disse, mas fechar a abrir a conexão com o banco poderá causar uma lentidão na execução não é?

Obrigado

Airton


Responder

Gostei + 0

23/11/2006

Aerreira

Para tentarmos identificar o problema: após criar o .bat ele é chamado pela sua aplicação, certo? A forma como está chamando o .bat está correta? E o que ele faz?

Já revisou seu programa à busca de algo que, sem querer, esqueceu na memória? Algo que esteja público desnecessariamente e que fica acumulando ao longo das diversas execuções a cada 10 segundos?

A questão de abrir e fechar o banco, ao meu ver é o mais correto, porém vale você fazer uns testes para ver no que isso irá impactar em termos de perfórmance.


Responder

Gostei + 0

23/11/2006

Luizf2

Airton,

Já passei por este problema.
E, após muita pesquisa, descobri que este é um problema do Windows e não da aplicação.
Acontece que, quando você libera memória na sua aplicação, o Windows não libera esta memória, e a aplicação fica com a memória crescendo infinitamente.
É bom lembrar que esta alocação/liberação de memória nem sempre se dá de forma explícita, ou seja, você nem sempre controla isso, como é o caso dos componentes da VCL.
No meu caso, tenho várias aplicações rodando numa mesma máquina que ficam coletando dados de campo.
Fiz vários testes usando ponteiros e também sem usar um ponteiro sequer, e era sempre o mesmo problema.
Tem duas coisas que minimizam o problema, ou seja, diminuem sensivelmente o crescimento de memória: procure usar o tipo ´string´ com tamanho definido ´string[40]´ ou ´string[255]´ enfim, qualquer tamanho fixo, outro detalhe é o uso de ´threads.
Mesmo fazendo estas alteações o problema continuou, apesar de o crescimento de memória ter diminuido.
Não encontrei nenhuma solução para a aplicação em si.
Num primeiro momento, tentei usar o ´Application.Minimize´, mas esta solução não se mostrou eficiente com o decorrer do tempo.
Então veio a solução tupiniquim que resolveu e que está rodando até hoje, já fazem 5 anos.
Criei uma outra aplicação que, de tempos em tempos, fecha as aplicações coletoras e as coloca no ar novamente, chamei a aplicação de ´Monitor´. Como já disse foi uma solução tupiniquim mas que resolveu o problema.
Em tempo, este problema ocorre também no Linux, com o qual também já fiz testes usando o Kylix, e no Unix, que não testei mas que descobri nas minhas pesquisas.
Espero que tenha lhe ajudado de alguma forma.

Luiz Fernando

PS: Se você quiser o programa ´Monitor´, entre em contato que lhe mando os fontes.


Responder

Gostei + 0

23/11/2006

Massuda

Talvez [url=http://forum.clubedelphi.net/viewtopic.php?t=74457]este tópico[/url] ajude você a determinar se o problema é no seu programa ou no Oracle ou no Windows.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar