Uso de memória

Boa tarde galera,

estou com um probleminha de memória em uma consulta que tenho no meu sistema. A máquina tem apenas 128 MB então os recursos de memória são realmente poucos.

Identifiquei que o problema estava nesse método que faz umas busca por produtos e mostra em uma JTable. O que acontece é que como o ResultSet é grande utilizando um medidor de memória notei que acontece um salto de 8 MB pra 70 MB após a execução da Query. Até ai normal. O problema e que depois disso esse espaço não é mais liberado.

Gostaria de saber se tem alguma forma seja via código ou via parâmetro para a JVM que permita liberar esse espaço.

OBS: Já chamei o método clear do EntityManager e também já apelei pro System.gc() e não resolveu.

Agradeço qualquer dica ou esclarecimento.

Giu

public List<Produto> pesquisaProdutos() {        
        Query qy = em.createNamedQuery("Produto.pesquisaProdutos");        
        try {
            // JVM alocando 8 MB
            return (List<Produto>) qy.getResultList(); // ResultSet com 30.000 registros aproximadamente
            // JVM alocando 70 MB - JVM não desaloca mais esse espaço fazendo com que a máquina fique lenta
        } catch (Exception e) {            
            return null;
        }
    }

Teoricamente todos os atributos internos nascem e morrem junto ao método…

Ou seja ao retornar a sua lista todas as variáveis morrem. O problema talvez seja com a List que recebe essa consulta que passa a contar com os 70Mb segundo o que vc disse.

Esse teste eu também já fiz.

Não retornei a a lista e apenas medi a memória antes e depois da linha qy.ResultList() e a alocação já foi feita dos 70 MB.

O problema está extamente ali.

Giu

Acho que quando você disse que sua consulta possui muitos registros, acho que pode ser normal esse comportamento de “comer” esses quase 70mb de espaço. Acho também que realmente essa memória não deveria ser “limpada”, pois de acordo com o código postado, você retornou os dados dessa consulta. Então você, em algum lugar do seu código, ainda tem referência para esse bando de dados em memória.
Sendo assim, o comportamento da sua aplicação está correto. Tenta, ao invés de retornar esses dados, setar a variável para nulo e chamar o GC. Logicamente em algum lugar vai dar erro, mas você pode verificar se o GC está funcionando corretamente.

[]'s.

Sim sim…o problema esta exatamente ali no “qy.ResultList()”.

É aquela vela história…quem é o usuário que consegue ler 30.000 registros ?

Será que ao realizar essa consulta vc pensou em desempenho. Reduzir a sua query seria uma boa.