Как увеличить объем памяти, выделенной процессу на сервере Ubuntu?

Как увеличить объем памяти, выделенной процессу на сервере Ubuntu?

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

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

решение1

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

  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.

решение2

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

java -Xmx=2048m ...

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

Связанный контент