Qual o erro?

Depois de ocorrerem várias exceptions como esta:

Exception in thread "pool-27-thread-11893" java.lang.NullPointerException

Recebi este erro:

Error occurred during initialization of VM Could not reserve enough space for object heap

Isso ocorreu por causa das exceptions?

Se o null pointer ocorreu devido a estourar o número de conexões com o banco pode até ser. Sem ter o stack trace dessas null pointer exceptions fica difícil adivinhar.

No catalina.out só tem isso mesmo, eu acho que não foi nada em relação ao banco não, porque a conexão eu faço com JDBC puro, então, eu abro e fecho as conexões se não conseguir abrir espero e tento novamente, e outros máquinas com a mesma aplicação também usam o mesmo banco.

Aham… o problema, obviamente, não é abrir a conexão, e sim fechar. Você fecha tudo direitinho? Usa finally?

Sim, quando o problema era conexão, acabava dando problema nas três máquinas que usavam o banco de dados.
Eu faço requisições sockets será que o problema é isso?
Achei no log que teve várias requisições que receberam “null” como resposta do servidor, será que pode ter sido isso?
Quando é gerada várias exceptions deste tipo o heap da jvm pode ser “consumido”? E com isso gerar falta de memória?

Se você usar ObjectInputStream / ObjectOutputStream, por exemplo, você pode ter problemas sérios de “vazamento de memória”. Você usa alguma dessas coisas sem usar também o método “reset” ?

Eu uso o “OutputStreamWriter” e o “InputStreamReader”.

No meu código a parte que usa estes dois objestos está assim:

this.socket = new Socket(this.getIp(), this.getPort()); this.socket.setSoTimeout(500000); this.toServer = new PrintWriter(new OutputStreamWriter(this.socket.getOutputStream())); this.toServer.flush(); this.fromServer = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));

Could not reserve enough space for object heap
Isso é falta de memória !

De qualquer maneira, usar sockets é sempre meio complicado, porque os dois lados (cliente e servidor) devem ser cuidadosamente escritos de modo que não fiquem “sockets pendurados” (isso você pode constatar com o netstat).

Pode ser que você precise revisar sua aplicação que usa sockets para usar “TCP No Delay” (setTcpNoDelay), e também “Shutdown” (shutdownOutput, shutdownInput). Você precisa achar um fonte de uma aplicação que use isso direito para poder ver como é que isso é feito.

A configuração do tomcat está assim:

JAVA_OPTS="-XX:NewSize=1g -XX:MaxNewSize=1g -XX:SurvivorRatio=8 -Xms6g -Xmx6g -server -Dcom.sun.management.jmxremote"

Falta de memória eu sei que foi mas queria tentar entender o porque.

Mesmo matando a conexão do socket a conexão fica presa? E eu estou fazendo requisições socket para um servidor apache.

Então… depende. Você precisa ver se está chamando os “shutdownInput/shutdownOutput” adequadamente.

Para chamar um servidor Apache, normalmente (para evitar essas problemáticas de sockets) costuma-se usar uma URLConnection mesmo, que já usa o protocolo http ou https, dependendo de como você fez a configuração da URL.

Eu chamo o método close, dos dois objetos, para fechar a conexão.
E em relação a requisição é um HTTP GET normal.