Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 06 de Outubro de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
126 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Garbage Collection do Delphi e o Oracle
Publicado por ActiveDelphi : Quinta, Março 30, 2006 - 05:10 GMT-3 (3685 leituras)
Comentários 4 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Flávio Barbosa O “Garbage Colletion” ou “Coletor de Lixo” de uma linguagem é a forma pela qual os objetos ou variáveis instanciadas são liberadas de forma implícitas, ou seja, sem o comando direto do desenvolvedor. Por exemplo, quando se cria uma variável ou objeto privado ele é liberado automaticamente pela linguagem, no caso pelo Delphi, através de seus métodos de destruição sem a necessidade de informar que esses objetos ou variáveis devem ser destruídos.

A estes “métodos de destruição” ou “técnicas de destruição” que mantém a memória do computador “limpa” de objetos ou variáveis com referências perdidas, dá-se o nome de “Garbage Collection”.

     Quando for efetuado um instanciamento de um objeto TQuery dinamicamente (via código), devemos sempre utilizar o FreeAndNil para destruí-lo, mesmo sendo um objeto de visibilidade privada. Isto é necessário, porque embora o Garbage Colletion do delphi elimine o objeto instanciado da memória do computador o Oracle não elimina o cursor enquanto a conexão que o criou estivar ativa. Abaixo um Exemplo da maneira correta de se trabalhar:

procedure X; 
  Var 
    qryAux : TQuery; 
begin 
  qryAux := TQuery.Create( Nil ); 
  Try 
    //comandos a serem executados com qryAux 
  Finally 
    If ( qryAux.Active ) Then qryAux.close; 
    FreeAndNil( qryAux ); 
  End; 
End;

     Caso o sistema em Delphi não liberar o objeto Tquery explicitamente, o Oracle vai acumulando os cursores (“Querys”) enquanto o sistema estiver conectado, o que pode ocasionar o erro “ORA-01000: maximum open cursors exceeded”, que indica que a quantidade de cursores suportados pelo Oracle foi excedida. Quando o sistema é finalizado a conexão com o Oracle é fechada, consequentemente todos os cursores da conexão também são finalizados, desta forma se este erro ocorrer, o operador do sistema deverá sair e entrar novamente no sistema para voltar a utilizá-lo, causando um grande transtorno para o operador.

     É possível aumentar a quantidade de cursores que podem ficar abertos no Oracle aumentando o valor do parâmetro “open_cursors” (é necessário reiniciar o banco de dados), mas isto é uma solução paliativa, pois conforme a aplicação vai sendo utilizada os cursores continuam sendo acumulados até que em um dado momento causarão novamente um estouro do limite de cursores configurados.

Flavio Barbosa
fbarbosa@hcrp.fmrp.usp.br



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: ILovesRodelas : Abr 02, 2006 - 05:09
(Informações sobre o membro | Enviar uma mensagem) http://
e com a conexão SQL?


por: gjfreitas : Mai 10, 2006 - 08:39
(Informações sobre o membro | Enviar uma mensagem) http://
Flávio, sinto muito em enviar uma nota de correção, mas não poderia deixar uma informação falha neste site. Uma linguam com "Garbage Collection" cuida da liberação de memória de forma automática, como você mesmo disse, o coletor de lixo é um thread de baixa prioridade que é disparado sempre que os sistema está ocioso ou quando a memória está esgotando. Infelizmente o Delphi não possui um coletor de lixo, se possuísse nunca precisariámos executar o método free, destroy ou freeAndNil, estes métodos se fazem necessário pelo fato de não existir um coletor de lixo. A função do coletor de lixo é localizar todos os objetos que não são mais referenciados e liberar a memória utilizada, este recursos está disponível em linguagens como JAVA e dotNET, por isso acredito que um sistema criado em Delphi.NET também possa usufluir do coletor de lixo do framework dotNET.


por: Visitante : Dez 16, 2006 - 07:49
É isso mesmo. O Garbage Collection é um mecânismo coletor de lixo da memória. Seu funcionamento Flávio é da seguinte forma: Estando o sistema ocioso, ele aciona o Garbage que varre a memória procurando conteúdo sem ponteiros ativos, os liberando da memória. O JAVA possue um Garbage Collection, não o Delphi.


por: Visitante : Dez 16, 2006 - 07:51
Perai, o que vc fez foi somente liberar um ponteiro que vc mesmo criou da memória. Rs...pensei que fosse ensinar a criar o Garbage do JAVA...
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados