Я пытаюсь обеспечить максимальный объем памяти, который программа может потреблять в системе 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