максимальная память, которую malloc может выделять

Я пытался выяснить, сколько памяти я могу максимально использовать на своей машине (1 Гб оперативной памяти 160 Гб платформы HD Windows).

Я читал, что максимальная память malloc может выделяться ограничена физической памятью (в куче).

Также, когда программа превышает потребление памяти на определенном уровне, компьютер перестает работать, потому что другие приложения не получают достаточное количество памяти, которое им требуется.

Поэтому, чтобы подтвердить, я написал небольшую программу в C:

int main(){ int *p; while(1){ p=(int *)malloc(4); if(!p)break; } } 

Я надеялся, что будет время, когда распределение памяти завершится неудачно, и цикл сломается, но мой компьютер висел, поскольку это был бесконечный цикл.

Я ждал около часа, и, наконец, мне пришлось отключить компьютер.

Некоторые вопросы:

  • Поддерживает ли malloc также выделение памяти из HD?
  • В чем причина такого поведения?
  • Почему в какой-то момент не было перерыва?
  • Почему не было отказа в распределении?

Я читал, что максимальная память malloc может выделяться ограничена физической памятью (в куче).

Неверно: большинство компьютеров / ОС поддерживают виртуальную память, поддерживаемую дисковым пространством.

Некоторые вопросы: также malloc выделяет память с жесткого диска?

malloc запрашивает ОС, что, в свою очередь, может использовать некоторое дисковое пространство.

В чем причина такого поведения? Почему в какой-то момент цикл не прерывался?

Почему не было отказа в распределении?

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

Когда программа превышает потребление памяти до определенного уровня, компьютер перестает работать, потому что другие приложения не получают достаточного количества памяти, которое им требуется.

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

Я знаю, что эта ветка устарела, но для тех, кто хочет дать ей попробовать себя, используйте этот код

 #include  int main() { int *p; while(1) { int inc=1024*1024*sizeof(char); p=(int*) calloc(1,inc); if(!p) break; } } 

бег

 $ gcc memtest.c $ ./a.out 

при запуске этот код заполняет одну RAM, пока не будет убит kernelм. Использование calloc вместо malloc для предотвращения «ленивой оценки». Идеи, взятые из этой темы: Вопросы памяти Malloc

Этот код быстро заполнил мою оперативную память (4 ГБ), а затем примерно через 2 минуты мой раздел подкачки 20 ГБ до его смерти. Конечно, 64-битный Linux.

malloc выполняет собственное управление памятью, управляет небольшими блоками памяти, но в конечном итоге использует функции Win32 Heap для выделения памяти. Вы можете думать о malloc как о «реселлере памяти».

Подсистема памяти Windows содержит физическую память (RAM) и виртуальную память (HD). Когда физическая память становится недостаточной, некоторые страницы могут быть скопированы из физической памяти в виртуальную память на жестком диске. Windows делает это прозрачно.

По умолчанию виртуальная память включена и будет потреблять доступное пространство на HD. Таким образом, ваш тест будет продолжаться до тех пор, пока он не выделит весь объем виртуальной памяти для процесса (2 ГБ на 32-битных windowsх) или не заполнит жесткий диск.

Попробуй это

 #include  #include  main() { int Mb = 0; while (malloc(1<<20)) ++Mb; printf("Allocated %d Mb total\n", Mb); } 

Включите stdlib и stdio для него.
Этот экстракт взят из глубоких секретов .

Я действительно не знаю, почему это не удалось, но стоит отметить, что `malloc (4)« на самом деле не может дать вам 4 байта, поэтому этот метод не является точным способом найти максимальный размер кучи.

Я нашел это из моего вопроса здесь .

Например, когда вы объявляете 4 байта памяти, пространство непосредственно перед вашей памятью может содержать целое число 4, как указание на kernel ​​того, сколько памяти вы просили.

Согласно стандарту C90, вы можете получить хотя бы один объект размером 32 кбайта, и это может быть статическая, динамическая или автоматическая память. C99 гарантирует не менее 64 Кбайт. Для любого более высокого предела обратитесь к документации вашего компилятора.

Кроме того, аргумент malloc – size_t, а диапазон этого типа – [0, SIZE_MAX], поэтому максимум, который вы можете запросить, – SIZE_MAX, значение которого зависит от реализации и определяется в .

когда вы в первый раз выделяете любой размер на * p, каждый раз, когда вы оставляете эту память незаписанной. Это значит

в то время, когда ваша программа выделяет только память объемом 4 байта

, то как вы можете использовать всю оперативную память, поэтому устройство SWAP (временное пространство на жестком диске) не обсуждается. Я знаю алгоритм управления памятью, в котором, когда ни одна программа не ссылается на блок памяти, этот блок имеет право выделять для запроса памяти программ. Вот почему вы просто занимаетесь RAM-драйвером, и поэтому он не может дать возможность обслуживать другие программы. Кроме того, это болтающаяся справочная проблема.

Ans: Вы можете в наибольшей степени распределить память вашего размера RAM. Поскольку никакая программа не имеет доступа к устройству подкачки.

Надеюсь, у вас все вопросы получат удовлетворительные ответы.

  • Что же случилось с использованием GC.Collect ()?
  • Как получить доступную память C ++ / g ++?
  • Где постоянные переменные хранятся в C?
  • Чтение больших файлов в Java
  • Можно ли программно определить размер массива C ++? А если нет, то почему?
  • std :: вектор и непрерывная память многомерных массивов
  • Как динамически распределять пространство памяти для строки и получать эту строку от пользователя?
  • Удаляет ли вызов деструктор?
  • Как узнать, указывает ли указатель на кучу или стек?
  • Ядро обнуляет память?
  • C ++ Наведите несколько типов на вектор
  • Давайте будем гением компьютера.