java.lang.OutOfMemoryError: não é possível criar um novo encadeamento nativo

Eu vi um comentário como este

Um lugar que eu vi este problema é se você continuar criando threads, e em vez de chamar start (), chame run () diretamente no object thread. Isso fará com que o object thread não seja desreferenciado … Assim, após algum tempo, a mensagem não conseguirá criar um novo thread nativo.

nos fóruns Sun Java

No meu aplicativo, inicialmente planejamos usar o thread, mas depois decidimos não precisar mais, então apenas chamamos run () ao invés de start (). Precisamos fazer o GC manual para o novo threadClass (..)?

minha configuração de boot do tomcat

-Xms1024m -Xmx1024m -XX:MaxPermSize=450m 

Por que você cria um Thread em primeiro lugar?

Seu código deve implementar a interface Runnable .

Então, quando você decidir que deseja executá-lo em um thread, instancie um Thread com o Runnable como argumento e chame start() no object Thread .

Se, ao invés disso, você quiser apenas executá-lo no seu thread atual, simplesmente chame run() em seu object Runnable .

Isso tem várias vantagens:

  • você não envolve nenhum object Thread , desde que você não se importe com threads separadas
  • seu código é empacotado em um Runnable que se encheckbox mais conceitualmente: você não está escrevendo algum tipo especial de Thread, não é? Você simplesmente escreve algum código que pode ser executado / executado.
  • você pode facilmente mudar para usar um Executor que abstrair ainda mais a decisão

E por último, mas não menos importante, você evita qualquer confusão potencial sobre se um recurso de thread nativo é criado ou não.

Quando você chama o método run (), nenhum novo thread deve ser criado. E seus objects serão coletados pelo Garbage Collector quando não forem referenciados.

Sua outra parte do código pode estar criando muitos Threads.

Tente usar ThreadPoolExecutor (pool de threads) no seu código para limitar os threads em seu aplicativo, e ajuste o tamanho do seu threadpool de acordo para um melhor desempenho.

Você também pode verificar o seguinte para depurar seu problema: (referenciado no link) Há algumas coisas a fazer se você encontrar essa exceção.

  • Use o comando lsof -p PID (plataformas Unix) para ver quantos encadeamentos estão ativos para este processo.
  • Determine se há um número máximo de encadeamentos por processo definido pelo sistema operacional. Se o limite for muito baixo para o aplicativo, tente aumentar o limite de thread por processo.
  • Examine o código do aplicativo para determinar se há código que esteja criando threads ou conexões (como conexões LDAP) e não destruindo-as. Você poderia descarregar os encadeamentos Java para ver se um número excessivo foi criado.
  • Se você achar que muitas conexões são abertas pelo aplicativo, certifique-se de que qualquer thread criado pelo aplicativo seja destruído. Um aplicativo corporativo (.ear) ou aplicativo da Web (.war) é executado sob uma JVM de longa execução. Só porque o aplicativo está finalizado não significa que o processo da JVM termine. É imperativo que um aplicativo libere todos os resources que ele alocar. Outra solução seria o aplicativo usar um conjunto de encadeamentos para gerenciar os encadeamentos necessários.

Este link descreve muito bem como esse erro é lançado pela JVM: http://javaeesupportpatterns.blogspot.ro/2012/09/outofmemoryerror-unable-to-create-new.html

Basicamente é muito dependente do sistema operacional. No RedHat Linux 6.5 (provavelmente outras distribuições / versão e versões do kernel) o max_threads = max_process x 2.

O número máximo de encadeamentos é muito dependente do número de processos permitidos. Qual o número máximo de processos depende da memory física máxima que você instalou.

Se você der uma olhada no arquivo limits.conf (no meu RHL 6.5, ele está em /etc/security/limits.d/90-nproc.conf). Exerça o formulário do arquivo:

 # Default limit for number of user's processes to prevent # accidental fork bombs. # See rhbz #432903 for reasoning. * soft nproc **1024** root soft nproc unlimited 

Você verá que para usuários não-root é 1024 (o que significa 2048 max threads).

Para ver o número máximo de threads que seu usuário tem permissão para criar, execute este comando “cat / proc / sys / kernel / threads-max” ou “sysctl kernel.threads-max”.

Para resolver um problema como este (pelo menos funcionou para mim) como root, você precisará aumentar o máximo de threads permitidos:

eco 10000> / proc / sys / kernel / threads-max

Isso afeta todos os usuários e a raiz. O usuário precisa efetuar logout e, em seguida, efetuar login novamente para que as configurações tenham efeito.