Я разработчик, работающий над очень большим 32-битным приложением, интенсивно использующим память.Недостаток виртуального адресного пространства (памяти) является для нас проблемой.Во время моего исследования некоторых недавних проблем я заметил большой кусок памяти, зарезервированный IOKit (512 МБ).Эта память не выделена, а только зарезервирована.Дальнейшие исследования показали, что большинство приложений (Safari, iTunes и т. Д.) Также резервируют этот кусок памяти.Кажется, остается нераспределенным.Я использую vmmap для тестирования.Например, вот приложение Cocoa, созданное с использованием 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 есть некоторые интересные значения, но ни одно из них, похоже, не влияет на распределение памяти (даже после перезагрузки).