8

私はC++プログラム/Linuxを持っています。これは実行から2〜3秒以内std::bad allocに、32GBのRAMでエラーを吐き出し始めます(そしてラッパーの呼び出し元によって再起動されます)。私が本当に気にかけているのは、この問題を解決することですが、一歩一歩進んで、問題の理解に自信をつけていきたいと思います。

newシステムがリクエストにメモリを割り当てることができないようです(これは、OSのメモリが不足している場合に発生します)。プログラムの実行中に、別の端末でsar可能な限り最小の間隔(1秒)でコマンドを実行しますが、それkbcachedは最大24GBのメモリであることがわかります。OSがキャッシュを解放してそのメモリをnewリクエストで利用できるようにできないのはなぜですか?1秒は(プログラムの実行速度と比較して)時間がかかりすぎるか、ここで何か間違ったことをしています。

基本的には、OSが実際にメモリを使い果たしており、メモリを割り当てることができないことを相互検証して特定し、この時点から問題を解決したいと思います。どうやってするの?

理想的には、キャッシュの量、メモリの合計使用量など、メモリ割り当てが失敗した時点でシステム統計を取得したいと思います。

4

1 に答える 1

2

プロセスのメモリがどのように割り当てられているかを実際に確認したい場合gdbは、例外がスローされたときにブレークポイントを設定できます。その場合は、pmapなどのツールを使用してプロセスを検査します。これにより、プロセスがメモリを使用する方法に関する追加情報を表示できます。

それが原始的すぎる場合 (すぐにそうなるでしょうが、pmapかなり原始的です)、valgrindには Massif と、メモリ使用量、CPU 使用率、およびその他の実行時の問題を診断するための他の多くのユーティリティが含まれています。

于 2012-06-18T07:21:35.453 に答える