Aplicação consumindo memória
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
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
Curtidas 0
Respostas
Aerreira
22/11/2006
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....
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....
GOSTEI 0
Airoosp
22/11/2006
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
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
GOSTEI 0
Aerreira
22/11/2006
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.
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.
GOSTEI 0
Luizf2
22/11/2006
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.
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.
GOSTEI 0
Massuda
22/11/2006
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.
GOSTEI 0