Como evitar Memory Leaks

8 respostas
Hammer

bem, estou com alguns codigos aq e vejo q eles consomem bastante memoria na parte de psquisa, vou mostar como eu fiz aqui e voces poderao dizer oq fiz de errado q esta fazendo com que haja vazamento de memoria

isso aq fica no pacote dao:

public List consultarTabela() {
		session = ConnectDB.getInstance();
    	List list = null;
    	
		try {
			list = session.createQuery("from Cliente as cliente").list();
		}
		catch (HibernateException e) {
        	e.printStackTrace();
        }     	
    	finally {    		
        	fecha(session);
        	return list;
        }
	}

agora na aprte da interface grafica:

iterator = dao.consultarTabela().iterator();
        String nome;
        String cpf;
        String datac;
        modelo.addColumn("Nome");
        modelo.addColumn("CPF ou CNPJ");
        modelo.addColumn("Data de Cadastramento");
        ids = new int[dao.consultarTabela().size()];
        int x = 0;
        while(iterator.hasNext()) {        	
        	cliente = (Cliente) iterator.next();
        	ids[x] = cliente.getID();
        	nome = cliente.getNome();
        	cpf = cliente.getCpf();
        	datac = cliente.getDataC();
        	String[] linha = {nome, cpf, datac};
        	modelo.addRow(linha);
        	x++;
        	cliente = null;
        	linha = null;
        	nome = null; 
        	cpf = null;
        	datac = null;
        }        
        iterator = null;
        System.gc();

esse iterator eh global, mas depois de usar dou um = null; nele.
o que estou fazendo de errado que esta deizando com que minha aplicação consuma bastate memoria depois de varias consultas como essas ao banco de dados?

8 Respostas

B

Rode essa aplicação em um profiler. Qualquer boa IDE atual tem um profiler.

Hammer

eu uso o eclipse, alguem pode me ajudar como faço isso?

pcalcado

Sim, o google:

http://www.google.com/search?q=eclipse+profiler

Não dá para saber muito baseado no c;odigo que você postou mas você não deveria precisar chamar System.gc(), além do que duvido que ele esteja fazendo qualquer coisa util neste caso.

De qualquer modo, o que é bastante memória? Como o consumo de memória se comporta? Em quanto tempo você passa a ter problemas?

Hammer

vou dar uma pesquisada sim no google, estou um pouco sem tempo, mas depois posto aq oq consegui

se eu fizer varias consultas sucessivas ao bando de dados em poucos minutos ele estora a memoria de 512 e fica extremamente lento ai quando fecha o programa libera uma grande quantidade de memoria…

sergiotaborda

Hammer:
bem, estou com alguns codigos aq e vejo q eles consomem bastante memoria na parte de psquisa, vou mostar como eu fiz aqui e voces poderao dizer oq fiz de errado q esta fazendo com que haja vazamento de memoria

Se vc só quer iterar os dados porquê vc precisa de todos os dados ao mesmo tempo ? Não precisa. Vc só precisa de um de cada vez.
Tudo bem que a sua persistencia está ligada a OO, mas isso é um tiro no pe quando tem muitos dados.

Use o padrão Fastlane para resolver o seu problema.

Hammer

tava dando uma olhada e parece q pode resolver meu problema, mas essa class Factory serve pra qd eu tenho uma super class e varias sub-class n eh? so q no meu sistema isso nao existe, cocmo faço entao?

ViniGodoy

Monte seu projeto no Netbeans e use o profiler.
Eu também trabalho com Eclipse, mas tenho que admitir que o profiler do Netbeans é excelente, e muito fácil de usar.

Não adianta “chutar” a posição do vazamento de memória.

sergiotaborda

A factory referida é apenas uma forma de dizer que tem que existir alguem que lê o ResultSet e cria um objeto a partir desses dados.
Factory é um padrão possivel para isso. Mas o método pode ser simplesmente um método da própria classe Fastlane , embora isso não siga o principio de separação de responsabilidade que o codigo mostrado tenta seguir.

Criado 2 de julho de 2008
Ultima resposta 4 de jul. de 2008
Respostas 8
Participantes 5