Quando um OutOfMemoryError nao e falta de memoria…

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 ;-)

2 Responses to “Quando um OutOfMemoryError nao e falta de memoria…”

  1. kill -3 ajuda bastante a encontrar esses leaks.
    Melhor que qualquer profiler. (e olha que isso vem de quem escreveu um profiler)

  2. Raro ??? hehehe nem tanto :D