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

Memory leak em java

Boa noite.

Acho que estou com um problema de memory leak na minha aplicação. Percebi que cada vez que ocorre o GC o tamanha da minha heap aumenta e as geraç´~oes estão altas. Já corrigi alguns memory leak do driver JDBC e do C3P0 que não fechavam direito, mas mesmo assim continua dando esses picos de alocação de memória.

Alguém sabe o que posso fazer para corrigir isso?

Segue as telas mencionadas.

Gráfico da heap

https://www.filepicker.io/api/file/NleO2pd4QL6hMWiz68s4

time life dos objetos com as gerações

https://www.filepicker.io/api/file/665OXLFwQzKvta4KA1mX

  • bom, o que fica claro pelo time life é que quem está vazando são esses arrays de char ... tem algum trecho do seu códio que faz uso de char[] ? coloca-os em uma lista ? pode ser que esses arrays sejam internos a Strings ? alguma dessas hipóteses faz sentido ?

    Rodolfo Mendes   27 de jan de 2014
  • Você está carregando textos gigantes?

    Marcos___   27 de jan de 2014
  • Procure por variáveis estáticas na sua aplicação, elas são grandes causas de memory leaks. Além disso, tire um "Heap dump" e vá em "Show in Instances View". Analise algumas das instâncias por amostragem e veja se remetem ao mesmo lugar (geralmente sim). char[] são muito comuns em memory leaks com ResultSets e Statements.

    ViniGodoy   28 de jan de 2014
  • Olá pessoal, essas fotos foram tiradas entre as 20:08:00 e 20:09:40 e como pode ser visto a aplicação dá um salto no uso da heap. Agora estou revendo os atrbutos e métodos staticos. Qualquer coisa volto a postar no GUJ.

    ari_cesar   28 de jan de 2014
  • Esqueci de comentar. Lá no instances view, para localizar quem é o cara que está segurando a instância, vá na janelinha "References" (no canto inferior direito da tela), clique com o botão direito e busque a "Nearest GC Root". Geralmente isso vai cair em alguma variável estática. No caso de char[], procure evitar usar na amostragem os primeiros elementos, já que provavelmente serão coisas da própria VM. Vá para os últimos, que provavelmente foram alocados para você.

    ViniGodoy   28 de jan de 2014
  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!

2 respostas

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