Насколько я могу судить, есть четыре варианта:
Ubuntu не ограничивает память на процесс по умолчанию, но есть способы установить эти ограничения. Самый простой способ узнать, что было сделано (если вообще что-то), - обратиться к человеку, который управляет сервером.
Если вы используете VPS, а не реальный сервер, возможно, проблема в конфигурации виртуальной машины.
Я не знаю точно, как работает Java, но C ограничивает объем памяти, доступной стеку при компиляции. В этом случае вы можете либо указать компилятору увеличить размер стека, либо переместить большие массивы в кучу.
Если ваша ОС 32-битная, доступная память на процесс жестко ограничена (где-то между 2 ГБ и 4 ГБ). Если на вашем сервере установлен 64-разрядный процессор, это можно легко исправить, установив 64-разрядную ОС.
Возможность 4 довольно легко исключить. Чтобы убедиться, что это 1, 2 или 3, вы можете скомпилировать следующее с помощью gcc (или написать эквивалент в 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);
}
и выполните это количество памяти, которое вы хотите выделить в качестве параметра командной строки.
Вы должны быть в состоянии выделить всю память, которая сообщается как свободная или кэшированная. Если вы можете, вы исключаете возможность 1 и, возможно, 2.