E ai povo,
Atualmente eu andei tendo problemas com o coletor de lixo do java em uma aplicação web no cliente, isso começou do nada.
Depois de algum tempo rodando, a aplicação simplesmente para de funcionar, notei que nos logs da aplicação aparecem erros imensos e o último é sempre do tipo
Caused By: java.net.SocketException: Too many open files
....
Isso fica direto toda vez que a aplicação tenta acessar o banco ou alguém tenta acessar uma página dela.
Começou a acontecer de um tempo para cá, antes a aplicação rodava meses sem parar, agora roda algumas horas e morre.
Fazendo testes e pesquisando na internet, descobri que o linux (o SO do meu cliente é linux, e esse não é o problema, pois tenho outro cliente rodando a mesma aplicação em linux e o problema não ocorre) tem um limite para arquivos abertos.
Com isso fiquei monitorando a quantidade de arquivos abertos e descobri que a aplicação vai abrindo arquivos até estourar o limite.
Fiz o mesmo teste localmente e a quantidade de arquivos ficava entre 100 e 400, qdo atingia por volta de 300 e 400, o coletor de lixo do java passava e limpava tudo.
Porém no meu cliente isso não ocorre, os testes que eu fiz foi na mesma distribuição que ele usa, e o servidor onde a aplicação está instalada, só tem java, tomcat e mysql e ainda por cima só roda a minha aplicação.
Mas ocorre algo mais estranho ainda, quando alguém envia uma requisição para a aplicação, o coletor de lixo do java simplesmente passa e libera os objetos da memória, a quantidade de arquivos cai para mais ou menos uns 300.
Segundo o meu cliente não houve nenhuma alteração naquele servidor.
Alguém sabe o que pode ser?
As versões dos programas instalados
Tomcat 6.0.18
Java 1.6.0_13u
MySQL 5.1
A aplicação usa Hibernate/JPA e Spring