По каким причинам «Невозможно выделить память», кроме превышения адресного пространства и фрагментации памяти? - PullRequest
2 голосов
/ 22 июля 2011

Проблема в том, что в 32-битном приложении в Mac OS XI появляется ошибка

malloc: *** mmap(size=49721344) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug

. Для справки код ошибки находится в sys / errno.h:

#define ENOMEM   12  /* Cannot allocate memory */

Шаблон распределения памяти выглядит следующим образом:

  1. Сначала выделяется почти 250 МБ памяти
  2. Выделите 6 блоков по 32 МБ
  3. Затем обрабатывается 27 изображений, каждое из которых выглядит следующим образом
    1. Выделить 16 МБ (загружено растровое изображение)
    2. Выделить 32 МБ, обработать его, освободить эти 32 МБ
    3. Снова выделить 32 МБ, обработать его, освободить эти 32 МБ
    4. Свободные 16 МБ, выделенные на шаге 3.1
  4. Свободные 4 блока, выделенные на шаге 2 (все еще используются 2 блока)
  5. Свободные 250 МБ, выделенные на шаге 1
  6. Выделите блоки различного размера, общий размер не должен превышать 250 МБ.И здесь я получаю упомянутую ошибку выделения памяти

Я проверил, что ни один из этих блоков памяти не просочился, поэтому я предполагаю, что используемая память в любой момент времени остается ниже 1 ГБ, которая должна быть доступна на 32-битная система.

Вторым предположением была фрагментация памяти.Но я проверил, что все блоки на шаге 3 используют одни и те же адреса.Поэтому я касаюсь менее 1 ГБ памяти - фрагментация памяти не должна быть проблемой.

Теперь я полностью потерян, что может быть причиной не выделения памяти.Также все работает нормально, когда я обрабатываю менее 27 изображений.Вот часть результата команды кучи до шага 6 для 26 изображений:

Process 1230: 4 zones
Zone DefaultMallocZone_0x273000: Overall size: 175627KB; 29620 nodes malloced for 68559KB (39% of capacity); largest unused: [0x6f800000-8191KB]
Zone DispatchContinuations_0x292000: Overall size: 4096KB; 1 nodes malloced for 1KB (0% of capacity); largest unused: [0x2600000-1023KB]
Zone QuartzCore_0x884400: Overall size: 232KB; 7039 nodes malloced for 132KB (56% of capacity); largest unused: [0x3778ca0-8KB]
Zone DefaultPurgeableMallocZone_0x27f2000: Overall size: 4KB; 0 nodes malloced for 0KB (0% of capacity); largest unused: [0x3723000-4KB]
All zones: 36660 nodes malloced - 68691KB

И для 27 изображений:

Process 1212: 4 zones
Zone DefaultMallocZone_0x273000: Overall size: 167435KB; 30301 nodes malloced for 68681KB (41% of capacity); largest unused: [0x6ea51000-32372KB]
Zone DispatchContinuations_0x292000: Overall size: 4096KB; 1 nodes malloced for 1KB (0% of capacity); largest unused: [0x500000-1023KB]
Zone QuartzCore_0x106b000: Overall size: 192KB; 5331 nodes malloced for 101KB (52% of capacity); largest unused: [0x37f2f98-8KB]
Zone DefaultPurgeableMallocZone_0x30f8000: Overall size: 4KB; 0 nodes malloced for 0KB (0% of capacity); largest unused: [0x368f000-4KB]
All zones: 35633 nodes malloced - 68782KB

Итак, каковы другие причины для «Невозможно выделить память» и какя могу их диагностировать?Или, возможно, я допустил ошибку, исключив упомянутые причины, тогда как я могу проверить их снова?

1 Ответ

2 голосов
/ 24 июня 2012

Оказалось, что я сделал ошибку, проверив, что адресное пространство не исчерпано. Вместо использования команды heap я должен был использовать vmmap. vmmap показало, что большая часть памяти используется изображениями, отображенными в память.

...