Galera,
A pelo menos uns dois meses, tenho lutado contra o problema de vazemento de memória. Praticamente reescrevi minha app. cercando todas as possibilidades que “pudessem” causar este erro. Minha app. é um cliente web service que fica atualizando de 10 em 10s. Seduzido pela facilidade e agilidade, desenvolvi usando o Netbeans + JAX-WS.
Acontece que hj um amigo meu me enviou o seguinte artigo:
http://143.106.50.145:8080/Cursos/IA847/01-07/JAX-memory-leak.pdf
Foi aí que eu vi que muito, mas muito provavelmente o vazamento de memória não estava ocorrendo por código gerado pro mim, mas sim pelo código gerado pelo netbeans (o código do web service).
Segue um trecho do artigo:
Esse código, após ser executado não é removido pelo garbage colector, mesmo após não ter
mais nenhuma referência para seus objetos. Dessa forma, cada vez que a operação do Web Service é
chamada, então uma parte da memória é perdida nesta operação, podendo causar o estouro da pilha de
memória da JVM.
Uma solução para esse problema seria criar uma classe que controle essa conexão com o Web
Service, dentro do padrão Singleton, ou seja, para todo o programa, existirá apenas uma criação do stub
entre o cliente e o servidor. Sempre que um método remoto for invocado, então ele deve ser feito a
partir deste novo e único objeto criado, acabando dessa forma com o vazamento de memória.
Após ler isso, me senti um pouco aliviado, que finalmente detectei o “provável” problema. Porém gostaria de pedir a ajuda dos amigos, sobre como usar o Singleton para a criação de apenas um stub entre o cliente e o servidor.
Agradeço muito a ajuda de todos!!!
Moral da história: Nem sempre o mais fácil é o melhor :!: :!: :!: