Eu tenho visto recentemente este problema bem e parece ser isolado a uma alteração feita no Oracle JVM de 32 bits entre Java 6 e 7. No Linux, rodando a 32-bit Java 7 VM com strace mostra a seguinte chamada do sistema quando ServerSocket.accept () é invocado sem ter definido SO_TIMEOUT:
32369 poll([{fd=5, events=POLLIN|POLLERR}], 1, 4294967295 <unfinished ...>
A chamada para poll () passa um valor de tempo limite de 2 ^ 32 milissegundos (4294967295), em vez do valor negativo esperado que indicaria um tempo limite infinito. Isso eventualmente faz com que ServerSocket.accept () lance uma SocketTimeoutException, que faz com que o código de inicialização do Tomcat execute um desligamento do servidor. Essa parte específica do Tomcat nunca espera que uma SocketTimeoutException seja lançada pelo ServerSocket.accept.
É mais fácil reproduzir esse problema se a chamada para poll () puder ser manipulada para que você não precise aguardar 2 ^ 32 milissegundos. Isso pode ser feito no Linux, substituindo a chamada do sistema de pesquisa. Um método para fazer isso envolve o uso da diretiva LD_PRELOAD para carregar uma versão modificada da pesquisa. Alguns exemplos de código que mostram essa ideia podem ser encontrados no link . Infelizmente, ele não substitui a pesquisa, mas pode ser facilmente estendido para isso.