Я разработчик, работающий над очень большим 32-битным приложением с интенсивным использованием памяти. Для нас проблема нехватки виртуального адресного пространства (памяти). Во время расследования некоторых недавних проблем я заметил большой кусок памяти, зарезервированный IOKit (512 МБ). Эта память не выделяется, а только зарезервирована. Дальнейшее исследование показало, что большинство приложений (Safari, iTunes и т. Д.) Также резервируют этот фрагмент памяти. Кажется, что он остался нераспределенным. Я использую vmmap для тестирования. Например, вот приложение Какао, созданное с помощью XCode, с использованием шаблона по умолчанию:
REGION TYPE VIRTUAL
=========== =======
CG backing stores 1008K
CG image 4K
CG raster data 64K
CG shared images 2252K
Carbon 7264K
CoreGraphics 16K
IOKit (reserved) 512.0M reserved VM address space (unallocated)
MALLOC 59.0M see MALLOC ZONE table below
MALLOC guard page 48K
MALLOC metadata 348K
Memory tag=242 12K
STACK GUARD 56.0M
Stack 8712K
VM_ALLOCATE 16.2M
__DATA 8296K
__IMAGE 1240K
__LINKEDIT 31.5M
__TEXT 76.7M
__UNICODE 536K
mapped file 27.4M
shared memory 1320K
=========== =======
TOTAL 809.2M
TOTAL, minus reserved VM space 297.2M
Могу ли я что-нибудь сделать, чтобы уменьшить или исключить этот пул памяти? Наше приложение действительно могло бы использовать эти 512 МБ !!!
РЕДАКТИРОВАТЬ: Я провел еще несколько исследований и, похоже, этот фрагмент памяти является кадровым буфером видеокарты, отображаемым в пространство пользователя. Поэтому я предполагаю, что более точный вопрос заключается в том, есть ли способ ограничить захват фреймбуфера такой большой части виртуального адресного пространства пользовательского режима?
РЕДАКТИРОВАТЬ: Провели дополнительное тестирование и обнаружили, что ключ, который необходимо изменить, - это IOFBMemorySize. Как показано, если вы выполните эту команду:
ioreg -l | grep IOFBMemorySize
Или вы можете увидеть это в IORegistryExplorer. Однако мне не удалось изменить это значение. Я попытался добавить его в Info.plist для ATIFramebuffer.kext, ничего не вышло. Я попытался написать программу, которая вызывает IOConnectSetCFProperty, но она вернула kIOReturnUnsupported.
РЕДАКТИРОВАТЬ: После дополнительных исследований кажется, что этот ключ IOFBMemorySize, скорее всего, доступен только для чтения, просто сообщая об объеме памяти, доступной на видеокарте. Выглядело несколько интересных значений в Configuration.plist для CoreGraphics, но ни одно из них не повлияло на распределение памяти (даже после перезагрузки).