11

我是一名开发人员,正在开发一个非常大的内存密集型 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 中似乎有一些有趣的值,但它们似乎都不会影响内存分配(即使在重新启动后)。

4

3 回答 3

2

我认为您以错误的方式看待这个问题。

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

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

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

于 2011-07-03T22:57:30.777 回答
0

一个。您是否尝试过在较弱的显卡上运行它?那么也许只会分配128fb?显卡的硬件设置?

湾。使用代码注入取消内存分配...

假设这是您的私有应用程序,它不使用帧缓冲区等,
这显然不是单行更改,但是您可以更改代码以分配较小的缓冲区,或者分配失败,或者允许分配然后释放它(并在程序关闭期间反转)等

我敢打赌这可以稳定地完成

于 2011-07-20T08:43:25.767 回答
0

诚然,这不是您问题的答案,而是关于如何继续的建议......

您写道,您正在开发一个非常大的 32 位应用程序,因此也许现在是重新考虑您的可执行架构并将非常大的应用程序分成多个进程的时候了。也许您想将 32 位特定(QT?)代码打包到一个应用程序中(无论是后台进程还是 GUI 驱动的......),然后将更多内存密集型和面向处理的位放入辅助(64 位?)应用程序中。有多种进程间通信可供选择,您的应用程序可能会受益于更加并行化的架构。

只是一个想法......祝你好运!

|K<

于 2011-07-07T09:47:40.153 回答