如何在进程启动时降低IOKit预留的内存量?

pj4*_*533 11 macos memory-management framebuffer core-graphics iokit

我是一个开发人员,从事一个非常大的内存密集型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
Run Code Online (Sandbox Code Playgroud)

有什么办法可以减少或消除那段记忆吗?我们的应用程序真的可以使用512MB!

编辑:我做了一些更多的研究,似乎这块内存是映射到用户空间的视频卡帧缓冲.所以我想一个更准确的问题是,是否有限制帧缓冲区占用用户模式虚拟地址空间的这么大部分?

编辑:做了一些进一步的测试,发现需要更改的密钥是IOFBMemorySize.如图所示,如果执行此命令:

ioreg -l | grep IOFBMemorySize
Run Code Online (Sandbox Code Playgroud)

或者你可以在IORegistryExplorer中看到它.虽然我没有成功改变这个价值.我尝试将它添加到ATIFramebuffer.kext的Info.plist中,没有用.我尝试编写一个调用IOConnectSetCFProperty的程序,但它返回了kIOReturnUnsupported.

编辑:经过更多的研究,似乎这个IOFBMemorySize键可能是只读的,只需报告视频卡上可用的内存量.在CoreGraphics的Configuration.plist中看起来有一些有趣的值,但它们似乎都没有影响内存分配(即使重启后).

Gra*_*yer 2

我认为你看待这个问题的方式是错误的。

A) IOKit 没有为帧缓冲区占用 512MB 内存。

B)它在您发布的表中指出,因此reserved VM address space (unallocated)这可能是映射为虚拟内存空间的驱动器内存。

C) 如果正在运行的应用程序内存不足,则需要以不同的方式构建它,检查分配和泄漏,并在必要时执行缓存和延迟获取。