Estou tentando configurar um servidor de mensagens altamente simultâneo e parece usar muita memória. Atualmente nosso sistema operacional de servidor é Ubuntu e o software de servidor é escrito em Java. Sob carga, ficamos sem memória, mas apenas 70% dos meus 8 GB de RAM são usados.
Como posso alocar mais memória para meu processo Java?
Responder1
Pelo que posso dizer, existem quatro possibilidades:
O Ubuntu não limita a memória por processo por padrão, mas existem maneiras de configurar esses limites. A maneira mais fácil de saber o que foi feito (se foi feito) seria consultar a pessoa que administra o servidor.
Se você estiver em um VPS e não em um servidor real, pode haver um problema com a configuração da VM.
Não sei exatamente como o Java funciona, mas C restringe a memória disponível para a pilha durante a compilação. Nesse caso, você pode instruir o compilador a aumentar o tamanho da pilha ou mover arrays maiores para o heap.
Se o seu sistema operacional for de 32 bits, a memória disponível por processo será limitada (algo entre 2 GB e 4 GB). Se o seu servidor tiver uma CPU de 64 bits, isso pode ser facilmente corrigido instalando um sistema operacional de 64 bits.
A possibilidade 4 é muito fácil de descartar. Para verificar se é 1, 2 ou 3, você poderia compilar o seguinte com gcc (ou escrever o equivalente em Java):
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
long bytes = atol(argv[1]), counter, *pointer, words = bytes / sizeof(long);
// try to allocate memory
if ((pointer = malloc(bytes)) == NULL)
{
puts("Could not allocate memory");
exit(1);
}
// play with memory, so compiler won't optimize allocation out
for(counter = 0; counter < words; counter++)
pointer[counter] = counter;
exit(0);
}
e execute-o com a quantidade de memória que deseja alocar como opção de linha de comando.
Você deve ser capaz de alocar toda a memória relatada como livre ou em cache. Se puder, você descarta a possibilidade 1 e possivelmente 2.
Responder2
A maior memória usada pelos processos Java é o heap, onde a maioria dos objetos Java são armazenados. Por padrão, é limitado a 1 GB ou a uma fração da memória presente. Quando você está sem espaço de heap, você recebe uma exceção de falta de memória em Java. É possível aumentar (ou diminuir) o tamanho do heap para uma JVM usando a opção -Xmx. por exemplo:
java -Xmx=2048m ...
Se você estiver usando uma JVM de 32 bits, não poderá configurá-la com segurança para mais de aproximadamente 2,5 a 3 GB. Você precisa mudar para uma JVM de 64 bits para evitar essa limitação.