Могу ли я исчерпать виртуальную память на Linux? - PullRequest
4 голосов
/ 26 ноября 2009

Мое приложение похоже на гипотетическую программу:

for(;;) {
  for (i=0; i<1000; i++) {
    p[i] = malloc(random_number_between_1000_and_100000());
    p[i][0]=0;  // update
   }
  for (i=0; i<1000; i++) {
    free(p[i]);
  }
}

Нет утечек памяти, но в моей системе потребление памяти (вверху, столбец VSS) растет без ограничений (например, до 300% доступной физической памяти). Это нормально?

Обновлено - использовать память на некоторое время, а затем освободить ее. Это разница?

Ответы [ 4 ]

10 голосов
/ 26 ноября 2009

Поведение нормальное. Цитирование man 3 malloc:

ОШИБКА

По умолчанию Linux следует оптимистичной стратегии выделения памяти. Это означает, что когда malloc () возвращает не NULL, нет гарантии, что память действительно доступна. Это действительно плохая ошибка. Если окажется, что системе не хватает памяти, один или несколько процессов будут убит печально известным убийцей ООМ. В случае, если Linux используется в условиях, когда было бы менее желательно внезапно потерять некоторые из них выбранные процессы, и, кроме того, версия ядра достаточно свежая, можно отключить это чрезмерное выполнение, используя команду типа:

       # echo 2 > /proc/sys/vm/overcommit_memory

См. Также каталог документации ядра, файлы vm / overcommit-accounting и sysctl / vm.txt.

Вам нужно потрогать (прочитать / записать) память ядра Linux, чтобы фактически зарезервировать ее.

1 голос
/ 26 ноября 2009

ОС обычно выделяет все страницы как клоны копирования-при-записи "0" страница, то есть фиксированная страница, заполненная нулями. Чтение со страниц вернет 0, как ожидалось. Пока вы только читаете, все ссылки идут та же физическая память. Как только вы напишите значение, «COW» сломанный и реальный, физический, рамка страницы выделена для вас. это означает, что пока вы не пишете в память, вы можете сохранить выделять память до тех пор, пока не закончится адресное пространство виртуальной памяти или Ваша таблица страниц заполняет всю доступную память.

1 голос
/ 26 ноября 2009

Попробуйте добавить

  sbrk(-1);

в конце каждого цикла, чтобы увидеть, имеет ли это значение.

Функция free () только освобождает память, но не возвращает ее ОС,

0 голосов
/ 26 ноября 2009

Пока вы не коснетесь этих выделенных блоков, система не будет выделять их для вас.
Однако вы можете исчерпать адресное пространство, которое является пределом, который ОС накладывает на процессы, и не обязательно является максимумом, к которому вы можете обращаться с помощью системного указателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...