我是一名开发人员,正在开发一款非常大、占用内存较多的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中有一些有趣的值,但似乎没有一个能影响内存分配(即使在重启后也是如此)。