Linuxにはディスクキャッシュ(20G)で使用される十分なメモリがありましたが、私のアプリケーションは16Mチャンクを割り当てようとしてランダムにOOMエラーを返しました。
スワッピングが無効になっています。 OSの制限はすべて問題ないようです。
Drop_cachesでLinuxキャッシュをクリアした後、エラーが消えました。
何をチェックするべきか、それともどういうわけか予想される動作ですか?
十分なメモリがありましたが、おそらく断片化されているため、16MBの連続チャンクを取得できませんでした。 Drop_cachesはメモリのデフラグをトリガーするため、その後、malloc要求を受け入れるのに十分な連続メモリが利用可能になります。
(この質問は、おそらくプログラミングフォーラムの1つに適しています。)
Malloc()は物理メモリを割り当てず、仮想メモリを割り当てます。 Malloc()は、仮想メモリの不足(継続的な空きチャンク)またはコミット制限の超過が原因で失敗する可能性があります。
ps
、top
、またはpmamp
コマンドを使用して、プロセスの仮想メモリ使用量を確認します。 64ビットアーキテクチャ(AMD64)は非常に大きな仮想メモリを備えており、基本的にそれを使い果たすことは不可能ですが、32ビットプロセスは最大4GBの仮想メモリに制限されます。/proc/sys/vm/overcommit_memory
およびCommitted_AS
およびCommitLimit
行の/proc/meminfo
。 overcommit_memoryが1の場合、CommitLimitを超えると、malloc()が失敗します。