Я разработчик, работающий над очень большим 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 оказалось несколько интересных значений, но ни одно из них не повлияло на выделение памяти (даже после перезагрузки).