Gerenciamento de memória no Glassfish
Eu tenho várias tarefas em segundo plano em execução no meu servidor Glassfish implementado por@TimerService
instâncias. O objetivo desses serviços é extrair dados de arquivos e inserir esses dados no banco de dados.
Eu tentei inicialmente fazer isso em JPA, mas o sistema parou muito facilmente, agora eu convertei o processo para JDBC, que é muito mais ágil. No entanto, ainda há enormes vazamentos de memória em algum lugar ao longo do caminho que eu não posso identificar.
Cada arquivo é extraído em um método que gerencia suas próprias transações (1 file = 1 transaction). Eu pensaria que, uma vez que este método finalize todas as variáveis, solta o escopo e será GC'ed, mas este não é o caso. Depois de um tempo muito curto, estou experimentandoOutOfMemoryException
.
Eu estou querendo saber se, como e porque Glassfish estaria mantendo referência a minhas variáveis (que são objetos muito pesados). Quais configurações ou metodologias posso aplicar para minimizar esses vazamentos de memória?
Para referência eu estou usando as configurações de estoque Glassfish com algumas modificações:
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled
-XX:MaxPermSize=256m
–XmX1024m