Как я могу увеличить память, выделенную для процесса на сервере Ubuntu

9946
GeeKay

Я пытаюсь настроить сервер обмена сообщениями с высокой степенью одновременности, и, похоже, он использует много памяти. В настоящее время нашей серверной ОС является Ubuntu, а серверное программное обеспечение написано на Java. Под нагрузкой мы получаем исключение из памяти, но используется только 70% моей 8 ГБ оперативной памяти.

Как я могу выделить больше памяти для моего процесса Java?

1
какую версию ubuntu вы используете и какую архитектуру она использует ... если процесс приложения обмена сообщениями является 32-разрядным, возможно, существует ограничение на количество оперативной памяти, которое оно может использовать одновременно ... user1055604 11 лет назад 0

2 ответа на вопрос

3
Dennis

Насколько я могу судить, есть четыре варианта:

  1. Ubuntu не ограничивает память на процесс по умолчанию, но есть способы установить эти ограничения. Самый простой способ узнать, что было сделано (если вообще что-то), - обратиться к человеку, который управляет сервером.

  2. Если вы используете VPS, а не реальный сервер, возможно, проблема в конфигурации виртуальной машины.

  3. Я не знаю точно, как работает Java, но C ограничивает объем памяти, доступной стеку при компиляции. В этом случае вы можете либо указать компилятору увеличить размер стека, либо переместить большие массивы в кучу.

  4. Если ваша ОС 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.

0
jlliagre

Самая большая память, используемая процессами Java, - это куча, в которой хранится большинство объектов Java. По умолчанию он ограничен 1 ГБ или частью памяти. Когда вам не хватает места в куче, вы получаете исключение Java из памяти. Вы можете увеличить (или уменьшить) размер кучи для JVM, используя опцию -Xmx. например:

java -Xmx=2048m ... 

Если вы используете 32-битную JVM, вы не можете надежно установить ее более чем на ~ 2,5-3 ГБ. Вам нужно переключиться на 64-битную JVM, чтобы избежать этого ограничения.