プロが教えるわが家の防犯対策術!

アプリケーションからnewでメモリを確保するのですが
動作が不可解なので書き込みました。

PCにのっているメモリは2GB、スワップに十分なHDの空き容量もあるにもかかわらず(常駐ソフトもなし)
500MBのメモリすら確保できません。
ところが、300MBをnewすると計3回の呼び出しには成功
し900MBとれたところで失敗しました。
また、メモリを確保するだけの簡単なアプリを作った
ところ600MB確保できたのに、メモリを起動後24MB
使用しているアプリから600MB確保しようとすると
失敗しました。
アプリのOSの仕様上の最大は2GB使えるのでスワップ
してもいいので2GB使いたいのですが無理なんでしょう
か?2GB全部といわなくても1.5GBくらいつかえない
んでしょうか?

A 回答 (2件)

起動した直後でも少なからずフラグメンテーションは起きています。


Windowsは起動直後に色々なサービスを同時に起動するわけですから単にOSだけの問題
ではありません。
サービスを極力手動で停止すれば、改善はされるでしょう。

□□□□□□□□□□□□□
というメモリがあったら
■■■□□□□□□□□□□
という風に確保していくのかと思っているかもしれませんが
実際は
■■□□□■□□□□□□□
こんな感じだったりします。


Windowsはプロセス毎に仮想メモリアドレスを物理メモリアドレスに変換するマップ
を持っていて物理メモリアドレスに直接アクセスすることはできません。
またユーザー側で物理メモリを好きな位置に配置換えをすることもできません。
それはWindowsが管理しています。
WindowsのHeapAllocがどういうアルゴリズムで動いているかの詳細を
知っているわけではないので、何故そういう仕組みなのかは説明できませんが
いずれにしても、1500Mの連続領域をとるという事が
OSの設計概念的に意図しないことなのです。
ちなみにLinuxやMacOSでも同じだと思います。

>移動可能なメモリとして確保していないのでしょうね。
APIでGlobalAllocを使用すれば移動可能メモリとして割り当てる事ができます。
(今は前述のとおり仮想メモリ空間を持っているのであまりGlobalAllocもHeapAllocも変わらないようです。)
のため、物理メモリ以上の領域を確保でき、アクセス頻度の少ない領域はHDDにスワップするのです。
しかし連続領域としての1500Mは大きすぎるのです。

仮想メモリをとてつもなく大きくとれば、確保できるかもしれません。
(試したことはありませんしお勧めもしません。)

参考URL:http://nienie.com/~masapico/doc_MemMan.html
    • good
    • 0
この回答へのお礼

素人考えではすんなり順番につめてメモリが消費されていると思ったのですがそうではないのですね。
ありがとうございました^^

お礼日時:2005/03/02 09:05

500MBのメモリすら確保とは


連続領域で確保しようとします。
その為、フラグメンテーションが起きているメモリでは確保できないのです。
1MB×500なら確保できるでしょう。

>2GB全部といわなくても1.5GBくらいつかえないんでしょうか?
仮想メモリ空間では2ギガ割り当てられていますが
アライメント等を考慮すると、2ギガというのは無理でしょう。
しかし1MB×1500とかなら可能だと思いますが。

この回答への補足

ご回答ありがとうございます。
Windowsを起動した直後でもフラグメンテーション状態
なのでしょうか?
移動可能なメモリとして確保していないのでしょうね。

補足日時:2005/03/01 12:51
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!