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中看起来有一些有趣的值,但它们似乎都没有影响内存分配(即使重启后).
我认为你看待这个问题的方式是错误的。
A) IOKit 没有为帧缓冲区占用 512MB 内存。
B)它在您发布的表中指出,因此reserved VM address space (unallocated)这可能是映射为虚拟内存空间的驱动器内存。
C) 如果正在运行的应用程序内存不足,则需要以不同的方式构建它,检查分配和泄漏,并在必要时执行缓存和延迟获取。