私は非常に大規模なメモリ集約型の 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 を使用できます!!!
編集:さらに調査を行ったところ、このメモリのチャンクは、ユーザー空間にマップされているビデオ カードのフレーム バッファであるようです。したがって、より正確な質問は、ユーザーモードの仮想アドレス空間の大部分を占めるフレームバッファーを制限する方法があるかどうかだと思いますか?
編集: さらにテストを行ったところ、変更が必要なキーは IFBMemorySize であることがわかりました。次のコマンドを実行すると、次のようになります。
ioreg -l | grep IOFBMemorySize
または、IORegistryExplorer で確認できます。ただし、その値を変更することに失敗しました。ATIFramebuffer.kext の Info.plist に追加しようとしましたが、ダメです。IOConnectSetCFProperty を呼び出すプログラムを作成しようとしましたが、kIOReturnUnsupported が返されました。
編集: さらに調査した結果、この IOFBMemorySize キーは読み取り専用である可能性が高く、単にビデオ カードで使用可能なメモリの量を報告しているようです。CoreGraphics の Configuration.plist には興味深い値がいくつかあるように見えましたが、メモリ割り当てに影響を与えるものはありませんでした (再起動後でも)。