5

Я пытаюсь обеспечить максимальный объем памяти, который программа может потреблять в системе Unix. Я думал, что ulimit -v должен добиться цели. Вот пример Java-программы, которую я написал для тестирования:

import java.util.*;
import java.io.*;

public class EatMem {

  public static void main(String[] args) throws IOException, InterruptedException {
    System.out.println("Starting up...");
    System.out.println("Allocating 128 MB of Memory");
    List<byte[]> list = new LinkedList<byte[]>();
    list.add(new byte[134217728]); //128 MB
    System.out.println("Done....");
  }
}

По умолчанию мои настройки ulimit (вывод ulimit -a):

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31398
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 31398
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Когда я выполняю свою Java-программу (Java EatMem), она выполняется без проблем. Теперь я пытаюсь ограничить максимальный объем памяти, доступный для любой программы, запущенной в текущей оболочке, до 512 МБ, запустив следующую команду:

ulimit -v 524288

Вывод ulimit -a показывает предел, который должен быть установлен правильно (я полагаю):

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31398
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 31398
virtual memory          (kbytes, -v) 524288
file locks                      (-x) unlimited

Если я сейчас попытаюсь выполнить мою Java-программу, она выдаст мне следующую ошибку:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

В идеале это не должно происходить, поскольку моя Java-программа занимает всего около 128 МБ памяти, что находится в пределах моих указанных параметров ulimit. Если я изменю аргументы моей программы на Java, как показано ниже:

java -Xmx256m EatMem

Программа снова работает нормально. При попытке дать больше памяти, чем ограничено ulimit, как:

java -Xmx800m EatMem

приводит к ожидаемой ошибке. Почему программа не запускается в первом случае после установки ulimit?

Я пробовал вышеупомянутый тест на Ubuntu 11.10 и 12.0.4 с Java 1.6 и Java 7

1 ответ1

3

ulimit -v устанавливает максимальное адресное пространство, которое может использовать программа. Это включает в себя всю разделяемую память, такую как библиотеки, пространство стека потоков, прямую память и т.д. Поскольку JVM не предназначена для работы в среде с ограниченной виртуальной памятью, как эта, она может не располагаться оптимальным образом. то есть потому что виртуальная память обычно очень и очень дешевая. Я подозреваю, что вы должны установить это значение намного выше, чтобы запустить JVM.

Кстати: JVM выделяет максимальный размер кучи при запуске.


Если я установил ulimit -v 524288 и попытался сделать

Работает нормально

java -mx64m -version
java -mx128m -version
java -mx256m -version

Сбои с неспособностью malloc

java -mx300m -version

Произошла ошибка при инициализации ВМ

java -mx400m -version
java -mx512m -version

Это более или менее ожидаемое поведение.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .