Максимальное использование кучи разрешено на процесс - PullRequest
7 голосов
/ 27 августа 2009

Я использую malloc для выделения памяти, а требования к памяти превышают 1 ГБ. так что программа падает ...

Я хочу спросить, можно ли решить эту проблему? Если да, то чем как?

мой объем оперативной памяти составляет 3 ГБ и используется 32-разрядная ОС Windows и программирование с использованием vc ++

Ответы [ 3 ]

13 голосов
/ 27 августа 2009

Ограничение памяти на процесс составляет 2 ГБ (если вы не используете переключатель Windows / 3 ГБ ). Однако вы, вероятно, столкнулись с фрагментацией памяти. Когда память фрагментируется (визуализируйте с помощью VMMap ), вы не сможете выделить большой непрерывный блок. Ваши варианты:

  • Выделяют небольшими блоками (предпочтительно)
  • Найдите способ дефрагментировать память
  • Обновление до 64-битной ОС (вы все равно можете скомпилировать 32-битный код, но у вас будет до 4 ГБ для памяти пользовательского режима - не забудьте включить флаг компилятора с большой памятью; если вы компилируете 64-битный код на 32-битной ОС он вообще не будет работать, но ограничение памяти намного выше, чем 4 ГБ)
  • Если вам нужно столько памяти для загрузки файла, возможно, вы сможете отобразить файл в памяти
  • Возможно, вы сможете выделить самые большие блоки раньше, чем меньшие блоки.
2 голосов
/ 28 августа 2009

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

Куда относятся ваши dll и exes? Существует инструмент rebase.exe, являющийся частью среды ms vc, который позволит вам перераспределить позицию, в которую загружены dll или exe. Это может дать вам больше свободного места в виртуальной памяти, что позволит увеличить блоки памяти.

Опция профиля "Ходок зависимостей" покажет вам, где находятся ваши dll и exe загружены в.

vmmap от sysinternals может помочь лучше понять, как mwmory фрагментируется и обрабатывается.

2 голосов
/ 27 августа 2009

В 32-битной ОС Windows каждый процесс получает 4 ГБ виртуального адресного пространства, из которых 2 ГБ доступно для пользователя, а 2 ГБ - для ядра. Таким образом, все выделенные ресурсы должны быть в пределах 2 ГБ. Обратите внимание, что эти 2 ГБ содержат другие вещи, такие как другие библиотеки, которые загружаются вашим приложением, поэтому эта память фрагментирована. Когда вы выполняете malloc (), так как malloc гарантирует, что он возвращает непрерывный блок памяти, CRT попытается найти 1 ГБ непрерывной свободной памяти, которая может быть недоступна, поэтому malloc () завершается ошибкой. Одним из способов решения этой проблемы было бы использование файлов, отображаемых в память, и отображение только части необходимой памяти в виртуальном адресном пространстве.

...