Tenho uma aplicação Swing que adora dar Java Heap Space (OutOfMemory).
Estava tentando instalar o plugin Profiler do Eclipse para tentar encontrar quais variáveis ou métodos ou objetos estão presos na “memoria”. Porém foi impossível instalar esse plugin.
Existe alguma forma (Alguma classe da api) que me disponibiliza essas informações? Mostrando em Sysout quais os objetos estão no mundo matrix?
Dê uma olhada no Visual VM. Ele acompanha o próprio JDK 6. Fica na pasta bin do JDK.
É muito fácil, basta entrar nele e se conectar a uma aplicação que já esteja rodando.
Isso que dizer que 67% está sendo ocpuado por instanciar int[] ?
[/quote]
Exatamente (arrays são objectos). Repare que o profiler não destingue entre classes “suas” e de frameworks e da jse. Esses arrays podem estar em muitos lugares diferentes.
Se não me engano existe uma opção para filtrar por pacote, ai vc pode ver apenas as classes da sua aplicação, contudo, nem sempre o memory leak acontece nas nossas classes, normalmente acontece em classes de frameworks intermédios.
Uma boa é você procurar qual das suas classes de negócio está ocupando mais espaço. Bom, analise o heap e veja a arvore de alocação de cada instância, por amostragem (existe uma opção de mostrar as instancias aí). Muito provavelmente esses ints pertencerão a mesma classe. Tente por isso rastrear qual classe de negócios do seu programa tem o potencial problema.
Isso que dizer que 67% está sendo ocpuado por instanciar int[] ?
Tchuzin![/quote]
Oi lina,
Precisa prestar atenção quantidade de recursos alocados pelo tempo. Vetores de inteiro e vetores de byte podem significar vários tipos de objetos, como imagens, buffers, etc…
Presta atenção no int[], que pode ser um ArrayList, que está sendo incrementado e não há uma instrução para limitar sua capacidade.
algo do tipo:
[code]List lista = new ArrayList(X);
lista.add(obj); // é incrementado, mas posteriormente não existe um método que checa seu limite [/code]
é um memory leak, difícil de ser detectado, porque java vm gerencia e aloca memoria dinamicamente para ele(até extender os limites do heap da sua aplicação).
A lentidão pode ser derivada de estar lendo os metadados várias vezes. Tente executar getMetaData apenas uma vez. se necessário passe o objeto para submetodos. Sempre que vc chama isso ha comunicação com o banco e isso é uma fator de lentidão maior que a jvm. Contudo, não daria outofmemory (em tese)
Isso ele não está… Eu instancio o Array passando a quantidade de colunas.
Depois na próxima coluna eu limpo e crio ele novamente.
Coloquei um System.gc no final de todo o processo… parece que isso resolveu bastante a situação.
Obrigada!
Tchauzin![/quote]
O System.gc funciona relativamente. Se existir objetos referenciados, ele não funciona. Mas se a lista foi limpa, então não é essa ae o foco do problema.
Encontrei o problema!
Cada vez que replicava uma base de dados meu replicador criava uma nova conexão.
Sendo assim, quando estava em modo automático (Cada 5 segundos replicava novamente) e tinha apenas um banco de origem e um banco de destino, o replicador criava +1 conexão não fechando a outra.
Precisei executar o método DisconnectAll() para fechar as conexões e abrir novamente a cada replicação feita. Isso consumia muito Heap!
Encontrei o problema!
Cada vez que replicava uma base de dados meu replicador criava uma nova conexão.
Sendo assim, quando estava em modo automático (Cada 5 segundos replicava novamente) e tinha apenas um banco de origem e um banco de destino, o replicador criava +1 conexão não fechando a outra.
Precisei executar o método DisconnectAll() para fechar as conexões e abrir novamente a cada replicação feita. Isso consumia muito Heap!
O programa ajudou muito e vocês também!
Obrigado a todos!
Tchauzin![/quote]
Comsumir muito heap até pode, o que não pode é ficar alocado. Legal que deu certo, leaks são cansativos e difíceis de encontrar.
Isso ele não está… Eu instancio o Array passando a quantidade de colunas.
Depois na próxima coluna eu limpo e crio ele novamente.
Coloquei um System.gc no final de todo o processo… parece que isso resolveu bastante a situação.
Obrigada!
Tchauzin![/quote]
Algo que pode te ajudar um pouco no gerenciamento da memória disponível pode ser encontrado em um capítulo disponível para download do livro Arquitetura Java (disponibilizado pela Caelum). Dentre outras coisas, la menciona algunas alternativas ao algoritmo de coleta implementado nas VM´s.