1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Problemas com estouro de memória na JVM : OutOfMemory

Boa noite pessoal,

estou enfrentando um problema de uso excessivo de memória do servidor na minha aplicação. Esse erro ele vem me assombrando já há algum tempo, e eu venho cortando seus galhos pouco a pouco ao longo do tempo.

O que acontece é que tenho um determinado método, que atualmente é nele onde estou tendo esse problema. Abaixo o codigo do método:

public void verificarDuplicidades(){
        try{
            listaPessoas = ef.createBySameName(pessoa);
            if(listaPessoas.size()>0){
                pessoasDuplicadas = listaPessoas;
                nomesRepetidos = listaPessoas.size();
                nomeDuplo = true;
            }else{
                nomeDuplo = false;
            }
            listaPessoas = ef.createByEndereco(pessoa);
            if(listaPessoas.size()>0){
                pessoasEndDuplicados = listaPessoas;
                endDuplo = true;
            }else{
                endDuplo = false;
            }
        }catch(SQLException e){
            System.out.println(e.getMessage());
        }catch(OutOfMemoryError o){
            System.out.println("Estouro de memoria, verificar metodo: verificarDuplicidades - Classe:PessoaAction");
        }
    }

Neste método é possível ver que faço uma verificação no banco de dados, ao tentar incluir uma nova pessoa ao banco, para ver se já há alguma pessoa de mesmo nome e/ou endereço cadastrada, se sim, o sistema deve retornar essa lista em tela de pessoas duplicadas.

Aparentemente esse método não vai retornar tantos resultados assim, para que se possa extrapolar a memoria da JVM. Mas o problema é que esse método é executado dentro de outro método, que levanta uma lista bem grande de pessoas, as vezes.

Tentando encontrar uma solução, eu pensei que: Eu quero mostrar 4 informações em tela, mas essas listas que estou populando possuem mais de 30 variáveis, o bean de Pessoa possui muitos atributos que nesse caso, não são utilizados.

Aí vem a minha primeira duvida: criar um Bean específico para a tela que quero exibir, é melhor do que exibir uma lista de um bean que não é usado por completo, mesmo os outros atributos estando vazios? Isso tem um consumo considerável de memória?

A minha segunda duvida é: criando um bean específico para cada tela, eu não estaria violando alguma boa prática de programação? Pois, se vou criar um bean específico para cara tela, para que afinal criei o bean Pessoa?

Tenho sérios problemas com controle de memória da JVM, e já tem muito tempo que apanho para isso. Se alguem puder me ajudar, ou me apontar uma boa fonte de conhecimento sobre o assunto, ficarei imensamente grato.

  • Você já alterou os parâmetros da VM? Quais são? No loop que "levanta uma lista bem grande de pessoas", tu forma o garbage collector?

    Felipe Pinto da Silva   07 de ago de 2014
  • Dificilmente estouro de memória está relacionado com configuração de JVM. Para eliminar esse possibilidade, é interessante você, antes de mais nada ajustar a quantidade de memória utilizada pelo seu servidor. Adicione o parâmetro -Xmx2g na chamada da JVM. 2 GB de memória para um servidor já é uma quantidade suficiente de memória. Agora, o mais provável é que isso seja erro de programação mesmo. Em Java, a causa mais frequente de estouro de memória são referências a objetos mantidas sem necessidade. E muito provavelmente deve ser esse o seu caso. O ideal é você colocar código completo.

    Rodolfo Mendes   08 de ago de 2014
  • (continuando) O ideal é você colocar código completo da sua classe para analisarmos melhor.

    Rodolfo Mendes   08 de ago de 2014
  • Rodolfo, você falou uma coisa que me despertou a atenção. Dentro da minha classe Pessoa, eu tenho várias Lists, em que eu instancio logo no inicio da classe.

    List listaGraduacoes = new ArrayList();

    Além dessa, tem mais outras...oito listas. Acha que isso pode ser um causador?

    renangd   10 de ago de 2014
  • Só para esclarecer, eu não tenho como alterar os parâmetros da VM, pois ela não é minha, é de um servidor contratado, e estou recebendo emails constantemente avisando que minha aplicação está ultrapassando o limite de uso de memória. Para fins de esclarecimento, o servidor que contratei possui 512mb de memoria dedicada, mas minha aplicação não passa de 20 usuarios simultaneos, não acho que teria motivo para isso acontecer se não houvesse qualquer erro de programação.

    Provavelmente eu to fazendo merda...

    renangd   10 de ago de 2014
Mostrar todos os 8 comentários>
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags memória jvm java-ee ou faça a sua própria pergunta.