Problema com JPA e heap space

2 respostas
marcosbrandao

Olá galera.

Estou tentando aplicar o conceito de repository aqui num pequeno projeto. E como meio de persistência estou usando JPA. Estou fazendo uns testes de performance com uma tabela bem simples, sem relacionamento com 3 campos String e um Long. Eu insiro, consulto e logo após deleto os registros.
public class Client implements Serializable{
	private static final long serialVersionUID = 1L;

	@Id @GeneratedValue
	private Long id;
	private String nome;
	private String endereco;
	private String telefone;	
	
	@Transient	
	private ClientRepository repository;

    ...

    public void remove() throws BusinessException {				
         repository.remove(id);		
	}

        //outros metodos...
}
Até aqui tranquilo. Pra inserir e consultar tudo funciona sem problemas. O problema acontece quando eu passo a deletar, que causa Exception in thread "main" java.lang.OutOfMemoryError: Java heap space Quando chego perto de 8.000 registros deletados.

Aqui estão os codigos:

Metodo da classe Main que remove o client.
public static void remover(List<Client> listClient){				
    for (Client cliente : listClient){       		
      	cliente.remove();
    }
}
Classe que implementa o repository
public class ClientDao implements ClientRepository {
		
	JpaDAOFactory dao;
	
	public ClientDao(){
		dao = (JpaDAOFactory)DAOFactory.getInstance();
	}
	
        //Neste metodo que causa a exception
	public void remove(Long id) {
		try{
			dao.txBegin();			
			Client client = this.findById(id);	
			dao.getManager().remove(client);
			dao.txCommit();			
		}catch (DAOException e){
			dao.txRollback();
			throw e;
		}finally{
			dao.shutdown();			
		}
	}
}

Já estou dois dias tentando resolver este problema da heap space e não consigo entender o que está acontecendo.

Não sei se fui bem claro na minha duvida. Se não fui, postem pra mim tentar colocar de outra maneira.

Valeu...

2 Respostas

marcosbrandao

Galera, soh mais uma coisa.
Eu sei que se eu aumentar a memória para JVM isso pode resolver.
Mas se eu precisar colocar esta aplicação em uma hospedagem que não libere mais memória para jvm?
Talvez eu esteja pecando em alguma parte do código, que poderia ser feito diferente.

henrique.lima

marcosbrandao, sinceramente não sei o quanto isto irá lhe ajudar mas mesmo assim fica a sugestão.

Pude observar que toda vez que o método remove() é executado uma transação é aberta o objeto é removido e a transação é “comitada”. Isto significa que os registros serão deletados e se um erro ocorrer no meio, parte dos registros foram deletados e parte dos registros não foram. Sugiro que vc abra uma transação remova todos os registros e depois “commite” a transação. Desta forma, ou todos os registros serão deletados ou nenhum. Uma transação tem um sensível custo (de memória) e pode ser que isto esteja contribuindo para o OutOfMemoryError. Além disso, (conforme demonstrado neste link) é desta forma que a documentação do hibernate aconselha que tratemos as transações. Espero ter sido claro e que esta sugestão contribua com o seu objetivo.

Criado 20 de dezembro de 2007
Ultima resposta 28 de dez. de 2007
Respostas 2
Participantes 2