アプリケーションからnewでメモリを確保するのですが
動作が不可解なので書き込みました。
PCにのっているメモリは2GB、スワップに十分なHDの空き容量もあるにもかかわらず(常駐ソフトもなし)
500MBのメモリすら確保できません。
ところが、300MBをnewすると計3回の呼び出しには成功
し900MBとれたところで失敗しました。
また、メモリを確保するだけの簡単なアプリを作った
ところ600MB確保できたのに、メモリを起動後24MB
使用しているアプリから600MB確保しようとすると
失敗しました。
アプリのOSの仕様上の最大は2GB使えるのでスワップ
してもいいので2GB使いたいのですが無理なんでしょう
か?2GB全部といわなくても1.5GBくらいつかえない
んでしょうか?
No.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
No.1
- 回答日時:
500MBのメモリすら確保とは
連続領域で確保しようとします。
その為、フラグメンテーションが起きているメモリでは確保できないのです。
1MB×500なら確保できるでしょう。
>2GB全部といわなくても1.5GBくらいつかえないんでしょうか?
仮想メモリ空間では2ギガ割り当てられていますが
アライメント等を考慮すると、2ギガというのは無理でしょう。
しかし1MB×1500とかなら可能だと思いますが。
この回答への補足
ご回答ありがとうございます。
Windowsを起動した直後でもフラグメンテーション状態
なのでしょうか?
移動可能なメモリとして確保していないのでしょうね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CPU・メモリ・マザーボード 質問お願いします 「「RAM2GB+拡張4GB」などと書いてあるのは、搭載されているメモリ(RAM) 6 2023/08/28 12:31
- Windows 10 実装メモリとタスクマネージャーのメモリ使用量不一致について 4 2022/12/15 01:07
- ノートパソコン ノートパソコンに増設したメモリをWindowsに認識させる方法 5 2022/08/24 14:03
- CPU・メモリ・マザーボード hp dc5700SFFについて 2 2022/06/03 10:50
- CPU・メモリ・マザーボード PCの実装メモリと表示の違い 5 2023/02/19 19:32
- デスクトップパソコン ん~…分からん 7 2022/06/10 10:47
- CPU・メモリ・マザーボード メモリの増設について 6 2022/12/28 06:41
- ノートパソコン このノートパソコンで大丈夫でしょうか? 2 2023/04/22 21:01
- CPU・メモリ・マザーボード Windows11アップデート後の不具合(メモリ不足)について 9 2023/01/04 11:34
- アプリ ISOファイルをファイル名を保持して焼けるアプリ 1 2023/07/03 23:48
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
mallocについて
-
reallocについて
-
malloc呼び出し時のセグメンテ...
-
64ビットと32ビットの違い
-
mallocで確保するメモリの領域...
-
gcnew arrayによるメモリ確保に...
-
malloc、new のメモリ確保について
-
ビットをローテートするプログ...
-
stringの最大サイズ
-
大容量の静的な確保の限界値
-
座標値を読み込んである領域に...
-
MSDNがgethostbynameではなくge...
-
char*型が0x0を含む場合
-
DLLのマルチスレッドの動作につ...
-
メモリ不足になってしまう。
-
配列の添え字の最大数とは?
-
スタック破壊の上手な見つけ方...
-
OpenCV cvLoadImageについて
-
allocってなんですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
newしないオブジェクトについて
-
allocってなんですか?
-
スタック破壊の上手な見つけ方...
-
ヒープメモリの解放について
-
配列の添え字の最大数とは?
-
void*型のデータサイズ
-
c言語のポインタへの文字列入力...
-
DLLのマルチスレッドの動作につ...
-
C++で、メンバもヒープに確保さ...
-
指定したメモリアドレスの値の...
-
win32APIのHeapAlloc()の使い方...
-
ポインタのポインタの初期化法
-
プログラムが途中で強制終了し...
-
大容量の静的な確保の限界値
-
malloc呼び出し時のセグメンテ...
-
ヒープ領域の限界値設定
-
free関数で動作が止まる
-
stringの最大サイズ
-
64ビットと32ビットの違い
-
LPWSTRのコピー
おすすめ情報