В вашем распоряжении будет 3 Гб адресного пространства, если это 32-битный компьютер - 1 Гб зарезервировано для ядра. Из-за этого довольно много адресного пространства будет занимать совместно используемые библиотеки, exe-файл сегмент данных и т. д. Вы должны посмотреть на /proc/pid/maps
, чтобы увидеть, как распределено адресное пространство.
Трудно сказать, сколько доступно физического адресного пространства, все системные процессы, ядро и другие ваши процессы будут поглощены этим. Если предположить, что их сумма не превышает 1 ГБ, у вас все еще будет доступный 3Gb.
То, что может происходить, это фрагментация:
0Gb 3Gb
---------------------~------------------------------------
|Stuff | Heap,1.2Gb allocated stuff | free heap | Stack|
---------------------~------------------------------------
Затем вы освобождаете большой объект, но между какой-то другой памятью
выделено, оставляя вас с этим:
0Gb 3Gb
---------------------~------------------------------------------
|Stuff | Heap,1.2Gb free |small object(s) | free heap | Stack|
---------------------~------------------------------------------
Если вы попытаетесь выделить объект большего размера, он не уместится в свободном пространстве 1,2 ГБ.
И может не поместиться в пространство free heap
, так как для этого может не хватить места.
Если вы интенсивно используете стек, это может быть рост стека и использование пространства,
в противном случае можно использовать пространство кучи - хотя по умолчанию большинство дистрибутивов ограничивают стек до 8-10 МБ.
Использование malloc / realloc не поможет. Однако, если вы знаете размер самого большого нужного вам объекта, вы можете зарезервировать его при запуске. Эта часть никогда не должна быть свободна, удалена / удалена, она должна быть просто использована повторно. Трудно сказать, приведет ли это к другим неприятностям в другом месте - пространство, доступное для других объектов, уменьшится.