Могу ли я исчерпать виртуальную память в Linux?

StackOverflow https://stackoverflow.com/questions/1804026

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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]);
  }
}

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

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

Это было полезно?

Решение

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

  sbrk(-1);

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

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

Другие советы

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

ОШИБКИ

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top