2012-06-18 10 views
8

C++プログラム/ Linuxは、実行後2〜3秒以内にエラーstd::bad allocが32GB RAMに吐き出されます(ラッパー呼び出し元によって再起動されます)。私が本当に気にしているのはこの問題を解決することですが、私は一歩一歩進み、問題の理解に自信を持っていきたいと思います。std :: bad_allocエラーが発生しました。 OSが実際にメモリ不足になっているかどうかを確認する方法

システムがnew要求にメモリを割り当てることができないように見えます(これは、OSのメモリが不足している場合に発生します)。プログラムが実行されている間、私はsarコマンドをできるだけ短い間隔(1秒)で実行しますが、kbcachedは〜24GBのメモリです。 OSがキャッシュを解放し、そのメモリをnewリクエストで利用できるようにしないのはなぜですか? 1秒は(プログラムの実行速度に比べて)時間がかかりすぎるか、ここで何か間違っています。

基本的には、OSのメモリが不足しているため、メモリを割り当てることができず、この時点から何かを実行することができます。どうやってするの?

理想的には、メモリの割り当ては、どのくらいのキャッシング、合計最大使用メモリのように、失敗したとき、私は右の時点でのシステム統計を持ちたいなど、あなたが実際にあなたのプロセスのメモリが割り当てられているか確認したい場合は

+2

ちょっとメモします。あなたはどのようにRAMを持っているかとは無関係です。プロセスの仮想メモリアドレス空間に空きメモリがどれくらいあるかによって異なります。私はプロセス仮想メモリの割り当てを確認するコマンドを知りません。 – Naveen

+0

これはOS固有のものだと思います。 – sharptooth

+0

あなたのプロセスはどのくらいのメモリを割り当てましたか?あなたのプロセスにはどんな制約がありますか?それは32ビットですか? –

答えて

2

例外がスローされたときに、gdbのブレークポイントを設定することができます。そうであれば、pmapのようなツールを使ってプロセスを検査します。これは、プロセスがメモリをどのように使用するかに関する追加情報を表示します。

valgrindには、メモリ使用量、CPU使用率、その他の実行時の問題を診断するためのその他のユーティリティが含まれています(pmapは非常にプリミティブです)。

+1

特に(この場合)valgrind大量派ツール。マッシフは割り当てを追跡し、タイムライン上のメモリ消費量のグラフを得ることができます。スナップショットごとに、割り当てがどこから来たのかを識別します。 @MatthieuM。 –

+0

。たぶんあなたのコメントは自分の答えになるはずですか? – RedX

+1

@RedX:他に何も言わないので、もし価値があると思えば、スティーブンに自分の答えに詳細を追加させてもらう。 –

関連する問題