Tanto quanto eu 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 houver alguma coisa) 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 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.
-
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.