- ベストアンサー
ヒープ領域の限界値設定
大量にメモリを消費するアプリケーションを下記環境で動作させようとしています。 WindowsXP SP2, 1GB RAM タスクマネージャの物理メモリの利用可能 674,500K位 この状態でヒープ領域をレジストリで変更しようと思っているのですが 限界値が不明です。 徐々に3071⇒4096⇒8192と上げていっているのですが、限界値を超してしまうとOS自体が起動できなくなる恐れがあるので怖いです。 アドバイスください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
回答No.1に挙げた「デスクトップ ヒープ」で用いている「ヒープ」という用語は、グラフィックサブシステムで使用するためにWindowsのグラフィックサブシステムがあらかじめ確保して自分自身のために使用するメモリ領域のことを指しています。 また「mallocが使用するヒープ領域」という場合の「ヒープ」という用語は、ライブラリ関数mallocがWindows APIを使用して確保するメモリ領域のことを指しています。 ですので、「デスクトップ ヒープ」と「mallocが使用するヒープ領域」は違うものです。 「mallocが使用するヒープ領域」がどこから来るのかは、コンパイルに使用した言語環境のライブラリ関数mallocの動作内容に依存します。 仮にMicrosoft Visual C++(VC++ Version 6.0以降)を使用してコンパイルし、ライブラリ関数は標準添付のものを使用したとすると、mallocはWindows APIのHeapAllocで取得したメモリ領域をライブラリ内で細分(サブアロケート)して返します。またこの場合、HeapAllocで取得できるメモリ領域の量に固定の上限はなく、PCのメモリ実装量、Windowsのスワップ領域の大きさ、それとアプリケーションプロセスのメモリマップが許す限り、いくらでもHeapAllocはメモリを割り当てて返すことができます。 ですので上記の場合、mallocも同様に「PCのメモリ実装量、Windowsのスワップ領域の大きさ、それとアプリケーションプロセスのメモリマップが許す限りいくらでも」メモリを割り当てて返すことができます。 なお、上記動作はライブラリのソースコードを見て確認したものですので、使用しているコンパイラがVC++ではない、あるいはVC++でもVersion 6.0より古い場合、mallocが「いくらでもメモリを割り当てて返すことができる」かどうかは分かりません。(しかし、返すメモリ領域が「デスクトップ ヒープ」と違うものであることだけは変わりません。)
その他の回答 (1)
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
質問の意図がよく分からないのですが、ヒープ領域を広げておかないとメモリ割り当てに失敗するんでしょうか。よっぽど特殊なコードを書かない限り、2GB弱まで自動的にメモリ割り当てが行われるはずなのですが。 http://support.microsoft.com/default.aspx?scid=kb;ja;JP126962 このKBにある「デスクトップ ヒープ」のことを指しているのだとすれば、このヒープは「アプリケーションがグラフィックオブジェクトを作成するときに、グラフィックサブシステムがOSに要求するメモリ領域」であって、「アプリケーションがOSに対して要求するメモリ領域」とは違うものです。 参考: http://www.atmarkit.co.jp/fwin2k/win2ktips/071desktopheap/desktopheap.html なお、ウィンドウやコントロールやGDIオブジェクトを山のように作成するアプリケーションであれば、デスクトップヒープを使い果たすという可能性もなくはありません。念のため。
補足
回答有難うございます。 特殊なコードかどうかは不明(開発者が別)です。ただしそのアプリケーションが小さいファイルを読み込んでいるときは問題を起こさないのですが。 巨大なファイルを読み込ませるとアクセス違反を起こしています。 そもそもmallocした後処理の問題があるのは十分承知しているのですが、 修正されるまでの逃げ手としてヒープの拡張を考えていました。 >「アプリケーションがOSに対して要求するメモリ領域」とは違うものです Windowsアプリケーション内で使用するmallocはヒープ領域を使用すると 思い込んでいたのですが、違っていますか?
お礼
有難うございます。 ようは通常、2G以内であればメモリを割り当てられるっということになりますね。 物理メモリが4G以上あれば設定でもう少し大きくできそうですが。