我是一名开发人员,正在开发一个非常大的内存密集型 32 位应用程序。用完虚拟地址空间(内存)对我们来说是个问题。在调查最近的一些问题时,我注意到 IOKit 保留了一大块内存(512MB)。此内存未分配,仅保留。进一步调查表明,大多数应用程序(Safari、iTunes 等)也都保留了这块内存。它似乎保持未分配状态。我正在使用 vmmap 进行测试。例如,这是一个使用 XCode 制作的 Cocoa 应用程序,使用默认模板:
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
我能做些什么来减少或消除那个内存池吗?我们的应用程序真的可以使用 512MB !!!
编辑:我做了更多的研究,似乎这块内存是被映射到用户空间的视频卡帧缓冲区。所以我想一个更准确的问题是,是否有办法限制帧缓冲区接管这么大一部分用户模式虚拟地址空间?
编辑:做了一些进一步的测试,发现需要更改的关键是 IOFBMemorySize。如图所示,如果您执行此命令:
ioreg -l | grep IOFBMemorySize
或者您可以在 IORegistryExplorer 中看到它。不过,我未能成功更改该值。我尝试将它添加到 ATIFramebuffer.kext 的 Info.plist 中,不好。我尝试编写一个调用 IOConnectSetCFProperty 的程序,但它返回 kIOReturnUnsupported。
编辑:经过更多研究,似乎这个 IOFBMemorySize 键可能是只读的,只是报告视频卡上可用的内存量。CoreGraphics 的 Configuration.plist 中似乎有一些有趣的值,但它们似乎都不会影响内存分配(即使在重新启动后)。