Hoje de manhã, Bruno Borges, co-worker da Summa, me mostrou um site duma empresa famosa que exibia um stack trace com OutOfMemoryError
. Contudo, a mensagem exibida me lembrou de um problema que solucionei no ano passado e que mostra que nem sempre um OutOfMemoryError
tem a ver com falta de memória propriamente dita:
java.lang.OutOfMemoryError: unable to create new native thread
Normalmente esse erro é causado por um problema um tanto quanto raro em Java: thread leaks. Isso pode acontecer se threads auxiliares são criadas com frequência e se elas não forem corretamente encerradas. Geralmente as threads encontram-se em wait()
, mas a condição que deveria acordá-las nunca mais vai ocorrer.
A melhor forma de resolver esse problema é utilizar um profiler para identificar onde as threads que permanecem ativas são criadas e depois utilizar um debugger para investigar por que elas não são encerradas como esperado. Taí a dica ;-)
kill -3 ajuda bastante a encontrar esses leaks.
Melhor que qualquer profiler. (e olha que isso vem de quem escreveu um profiler)
Raro ??? hehehe nem tanto :D