3

malloc()に戻りNULL、設定errnoする状況がありますENOMEM。ただし、CRT ヒープ (拡張可能) には、使用できる十分なメモリがあります。の時点でmalloc、私のプロセス メモリは約 900 MB です。ホスト プロセスは、Sun HotSpot JVM の下で実行される Java 実行可能ファイルです。

malloc()私がやっているのは80メガバイトで、失敗します。60 MB の割り当てを行うと、成功します。その後、50 MB の割り当てに続いて別の割り当てが行われ、別の割り当ても成功します。明らかに、まだ多くのメモリが残っていますが、80 MB の malloc は OS が消化するには大きすぎるようです。

4 GB RAM の Windows 7 x64 SP1 を使用しています。私のプロセスは、VC++ 2010 SP1 で構築された 32 ビット プロセスです。Win 7 のデフォルトである Low Fragmentation Heap を使用しています。HeapQueryInformation でも確認しました。私が使用している VC2010 C ランタイムは、次の方法でヒープを作成します。

HeapCreate(0, BYTES_PER_PAGE, 0)

のドキュメントによると、HeapCreateは512KB を超えるブロックHeapAllocを自動的に呼び出します。VirtualAlloc

malloc()これがメモリ不足でない場合、一体何が失敗する可能性がありますか? 私の記憶はあまりにも断片的ですか?Windows はヒープを自動的に圧縮すると思っていました。これは本当に奇妙です。私はこれまでにこの動作を見たことがありません。

Windows XP SP3 32 ビットを搭載した別のコンピュータが同じ動作を示しています。

ありがとう、マーティン

4

0 に答える 0