Linux / JVM - OutOfMemoryError: impossível criar um novo encadeamento nativo

3

Eu tenho um problema de memória com um servidor Linux (CentOS). É uma VM. Abaixo está o contexto.

Tem 70 GB de RAM. Existem 2 tomcat em execução.

Um tomcat recebe um monte de 13Gb e o outro um monte de 20Gb.

Aquele com 20Gb tem a opção JVM -Xss160k set (para tentar resolver meu problema).

Estes 2 tomcat podem usar até 48Gb de RAM (virt.)

O Linux vai usar o 70Gb e haverá cerca de 35Gb de memória cache. A troca é de 1Gb e não usa praticamente nada disso (8Mb).

Agora, o problema é que recebo o seguinte erro do tomcat de vez em quando:

OutOfMemoryError: unable to create new native thread

Se não me engano, isso acontece se o próprio sistema operacional ficar sem memória e, portanto, não conseguir criar novos threads.

Agora a pergunta é: como isso é possível quando tem 35Gb de memória cache? Não deve realocar e usar conforme necessário.

Existe alguma opção do kernel que posso definir para evitar isso? Por exemplo, ele pode usar até 65Gb, armazenar em cache 30Gb e manter 5Gb livre.

    
por ttux 15.04.2013 / 13:58

3 respostas

1

Esta pode ser uma questão de limites definidos com ulimit. Como o usuário executando o tomcat, faça

ulimit -a

Na saída, procure a linha max user processes .

max user processes              (-u) 1024

Tente aumentar esse valor, por ex. ulimit -u 4096 , antes de iniciar o tomcat.

    
por 15.04.2013 / 14:44
1

Descobri como ter certeza de ter X quantidade de RAM disponível:

sysctl -w vm.min_free_kbytes=...

Eu ainda não sei se isso vai resolver meu problema ou se Jenny D responderá.

    
por 15.04.2013 / 16:33
0

Qual é o valor de Xms,Xmx,PermSize MaxPermSize no seu arquivo Catalina? Normalmente, tenho visto ajustar esses parâmetros evita os problemas de memória extra da JVM.

    
por 16.04.2013 / 12:54