Como posso aumentar a memória alocada para um processo no servidor Ubuntu?

1

Estou tentando configurar um servidor de mensagens altamente concorrente e parece usar muita memória. Atualmente, nosso sistema operacional do servidor é Ubuntu e o software do servidor é escrito em Java. Sob carga nós saímos da exceção de memória, mas apenas 70% da minha RAM de 8GB é usada.

Como posso alocar mais memória para meu processo Java?

    
por GeeKay 30.12.2012 / 06:48

2 respostas

3

Tanto quanto eu posso dizer, existem quatro possibilidades:

  1. 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 houver alguma coisa) seria consultar a pessoa que administra o servidor.

  2. Se você estiver em um VPS e não em um servidor real, pode haver um problema com a configuração da VM.

  3. Não sei exatamente como o Java funciona, mas o 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 matrizes maiores para o heap.

  4. Se o seu sistema operacional é de 32 bits, a memória disponível por processo é limitada (entre 2 GB e 4 GB). Se o seu servidor tiver uma CPU de 64 bits, isso pode ser corrigido facilmente instalando um sistema operacional de 64 bits.

A possibilidade 4 é bem fácil de descartar. Para verificar se é 1, 2 ou 3, você pode 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 a quantidade de memória que você deseja alocar como uma opção de linha de comando.

Você deve poder alocar toda a memória reportada como livre ou armazenada em cache. Se você puder, você descarta a possibilidade 1 e possivelmente 2.

    
por 30.12.2012 / 08:30
0

A maior memória usada pelos processos java é o heap, onde a maioria dos objetos java é armazenada. Por padrão, é limitado a 1 GB ou a uma fração de memória presente. Quando você está fora do espaço de heap, você obteve uma exceção java de memória. Você pode 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 mais de ~ 2,5 a 3 GB. Você precisa alternar para uma JVM de 64 bits para evitar essa limitação.

    
por 30.12.2012 / 10:26