char[] e byte[] ocupando 130MB de memória  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
adrianostanley
JavaGuru
[Avatar]

Membro desde: 28/06/2006 09:30:23
Mensagens: 243
Localização: Juiz de Fora/MG
Offline

Olá pessoal,

tenho uma aplicação que publicada está quebrando a todo momento com permgen space.

Executei o profiler do Netbeans e testo as funcionalidades da minha aplicação. Depois de um tempo, as classes char[] e byte[] juntas ocupam algo em torno de 130MB. Isso é normal?? Já verifiquei o código e não consigo achar locais onde pode haver alguma estrutura de iteração infinita ou algo do tipo, mas estou acumulando esses 130MB com somente 1 usuário logado. Imagina o publicado com mais usuários.
[Thumb - profiler.png]
 Nome do arquivo profiler.png [Disk] Download
 Descrição
 Tamanho 36 Kbytes
 Baixado:  17 vez(es)


Adriano 'Stanley'
http://www.enigmapremiado.com.br
[MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Sim, essas classes são fundações para as Strings. E as strings são usadas em diversas outras (resultsets, strings, stringbuilders, labels, etc).
Não adianta olhar para tipos de dados primitivos, você deve procurar onde estão sendo usados, e quem está criando tantos strings assim.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
adrianostanley
JavaGuru
[Avatar]

Membro desde: 28/06/2006 09:30:23
Mensagens: 243
Localização: Juiz de Fora/MG
Offline

Faz sentido o que vc disse, delas serem resultados de resultsets e stringbuilders pois utilizo muito builders. Porém imaginei que o coletor de lixo as removesse da memória no momento em que não são mais referenciadas. Não??

Adriano 'Stanley'
http://www.enigmapremiado.com.br
[MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

adrianostanley wrote:Faz sentido o que vc disse, delas serem resultados de resultsets e stringbuilders pois utilizo muito builders. Porém imaginei que o coletor de lixo as removesse da memória no momento em que não são mais referenciadas. Não??


Removem sim. Se estão aí, é porque estão sendo referenciadas, o trabalho é só descobrir por quem.
Mas é bom rodar o garbage collector, comparar dados, ver se isso está crescendo ou se mantendo, etc.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
adrianostanley
JavaGuru
[Avatar]

Membro desde: 28/06/2006 09:30:23
Mensagens: 243
Localização: Juiz de Fora/MG
Offline

Entendi.

Aproveitando, sem querer abusar, você sabe se isso pode estar acontecendo por um mal gerenciamento das sessões do Hibernate?

Reparei que esse número sempre cresce quando há alguma consulta no banco. Eu sempre fecho as sessões mas pode ser que elas continuem sendo referenciadas pelo SessionFactory ou ele já cuida disso?

Adriano 'Stanley'
http://www.enigmapremiado.com.br
[MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Deveria cuidar.

Uma forma de observar isso fácil e eficiente é fazer uma amostragem sobre as instâncias de chars/bytes alocadas, que objetos as contém.
Vá rastreando a pilha toda, que vc acaba chegando no culpado. Faça isso para umas 10 ou 15 instâncias, e veja se é sempre o mesmo.

Outra coisa, há muitas classes aí associadas a XML, ao jasper e a reflexão.
Esse é um sinal de que pode estar por aí o culpado também.

Tome muito cuidado se sua aplicação tem variáveis estáticas. Elas geralmente seguram todo mundo para quem apontam na memória. Como nunca saem de escopo, elas acabam se tornando vilãs no gerenciamento de memória.


Análise de memória é geralmente mais complicada do que análise de performance. É necessário estudar bem a base, para tentar entender quem está alocando o que, e quem está segurando quem.
Não é tão trivial quanto só olhar para um gráfico e dizer quem é o culpado (como fazemos com performance), infelizmente.

This message was edited 1 time. Last update was at 10/09/2011 17:37:58


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
adrianostanley
JavaGuru
[Avatar]

Membro desde: 28/06/2006 09:30:23
Mensagens: 243
Localização: Juiz de Fora/MG
Offline

Tá certo!!! Cara, mt obrigado pela ajuda!!! Valeu muito!!

Adriano 'Stanley'
http://www.enigmapremiado.com.br
[MSN]
adrianostanley
JavaGuru
[Avatar]

Membro desde: 28/06/2006 09:30:23
Mensagens: 243
Localização: Juiz de Fora/MG
Offline

Depois de analisar bastante o código, gerei um Profiler das classes do Hibernate.

Imagino que a classe Alias seja um dos problemas, pois quem as utiliza é o Criteria. Criteria é convertido em String que é enviada ao banco. Um String é um char[], certo?

Será que o problema pode estar aí?

Outra dúvida, o Profiler do Netbeans, quando indica "Bytes alocados", quer dizer que esses bytes estão alocados exatamente nesse momento ou isso é informação de histórico, isto é, se eu estou vendo a classe no Profiler, significa que ela está ainda alocada pela aplicação??
[Thumb - profiler.png]
 Nome do arquivo profiler.png [Disk] Download
 Descrição
 Tamanho 37 Kbytes
 Baixado:  5 vez(es)


Adriano 'Stanley'
http://www.enigmapremiado.com.br
[MSN]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team