Memory leaks

8 respostas
Hammer

bem, me parece q o problema de memory leak do meu programa esta nos meus resultSets olhem como estou fazendo e me digam se estou fazendo errado por favor, pq apos algumas consultas ao sistema o programa consome muita memoria sem o gc limpar ela apos fechar a janela

public List consultarTabela() { fecha(session); session = ConnectDB.getInstance(); tx = session.beginTransaction(); List list = session.createQuery("from Carros as carros").list(); return list; }

public List consultarTabelaCliente(Cliente cliente) { fecha(session); session = ConnectDB.getInstance(); tx = session.beginTransaction(); iterator = consultarTabela().iterator(); List<Carros> list = new ArrayList<Carros>(); int id = cliente.getID(); Carros teste; while(iterator.hasNext()) { teste = (Carros) iterator.next(); if(teste.getCliente() != null) { if(id == teste.getCliente().getID()) list.add(teste); } } return list; }

nesse consultarTabelaCliente ao qual eh um arrayList eu utilizo em um iterator em outra classe, mas nunca fecho o objeto list, tenho varios emtodos assim, este seria o erro? como deveria fazer?

e com respeito ao consultarTabela, ao qual retorna um List? uso tambem em um iterator mas nunca fecho esse list, seria este o problema? todas as minhas consultas estao assim, como deveria proceder?

8 Respostas

ViniGodoy
  1. Use um profiler para ter certeza. O Netbeans já vem com um;

  2. Não chute. Use um profiler para ter certeza.

  3. Se tiver problemas com memory leak. Use um profiler.

alberto_ribeiro

Já que você acha que é isso, pare de usar variável globais, usa um iterator dentro do seu método mesmo e não um iterator na classe…

[]'s

Hammer

ja usei um profiler e tem varias vezes q acusa, mas nao entendo mt bem ele, estou utilizando o JProfiler

e o programa fica lento so qd se faz algumas consultas ao bancos,s e so salar sem consultar anda nao muda nada durante o dia todo, entao confirmando oque estou dizendo

a ideia do iterator dentro do metodo vou utilizar estava usando um global, vlw aew

Hammer

bem, ainda nao estou conseguindo resolver este meu problema, mais alguma sugestao?

sergiotaborda

Duas coisas que não fazem sentido para mim

  1. Fechar a sessão antes de começar. Deveria ser depois de terminar e dentro de um try/finnally
    A conexão tem que ser fechada no fim do trabalho. Se não, era consumirá recursos. O que me leva a …

  2. abrir uma transação mas não a fechar. Deveria terminar a transação de dentro de um try/finnaly
    É absurdo iniciar uma transação para ler dados quando não ha uma ambiente concorrente. o seu ambiente é concorrente ? Tem a certeza ?

Algumas dicar. Use final sempre que possivel em variáveis auxiliares como seu ID.
Não acesse o iterator fora do while. existe uma diferença entre for (Iterator … ) e while (iterator )
É que se acessar (criar) o iterador dentro do for, quando o for terminar o iterador será descartado. se usar while ele só será descartado no fim do método.

Hammer

bem, acontece q sou meio novato ainda nisso, mas mt obg

estou fazendo os blocos com try-finaly, fechando a sessao no fim e nao no inicio, e agora o trasaction tb

eu crio o iterator antes do while, e so uso ele dentro do while, isso seria o certo? acontece q minha aplicaçãoa inda fica mt lenta conforme se faz consultas ao banco, parece q nao estou descartando oq esta sendo consultado no banco e esta consumindo mt memoria, oq poderia fazer? algum poderia dar exemplos da maneira certa de se fazer as consultas?

Hammer

bem, eu estou fechando o tx da seguinte forma dentro de um block finally

tx = null;
nao sei se ele vai fechar assim, se o gc() vai pegar ele e liberar da memoria caso ningum esta apontando pro transaction

e por incrivel q pareça nao sei oq eh ambiente concorrente.

Hammer

bem, estou usando o JProfiler tb, mas nao entendo ele muito bem, gostaria de saber como entender aqueles resultados, alguem poderia dar alguma ajuda?

Criado 22 de janeiro de 2008
Ultima resposta 18 de fev. de 2008
Respostas 8
Participantes 4