5

LinuxとC++を初めて使用し、アプリケーションのメモリ使用量について質問があります。

私のアプリケーションは、1秒あたり約500メッセージの大量のリアルタイムデータを処理します。

std :: mapを使用して、すべてのメッセージを管理(つまり、挿入と消去)します。例えば、

std::map<int, data_struct> m_map;

// when receive a new message, convert the message into a data structure
m_map.insert(std::pair<int, data_struct>(message.id, data));

// when need to erase a message
iter = m_map.find(id);
if (iter != m_map.end()) {
    m.map.erase(iter);
}

m_mapのサイズは約2500です。つまり、アプリケーションは最初に多くの新しいメッセージを受信し、その後徐々にメッセージを消去する必要があります。約10秒後、受信した新しいメッセージの数は、メッセージを消去する必要がある数とほぼ同じになります。

私の質問はこれです。約20分後、Linuxシステムモニターで、アプリケーションが使用するメモリが約1GBであることに気付きました。そして、サイズは20分ごとに2倍になるようです。これは正常なことですか、アプリケーションは実際にその量のメモリを使用しますか?ここで何かが足りませんか?

ありがとう。

4

3 に答える 3

19

プログラムがメモリのチャンクを頻繁に割り当てたり割り当てを解除したりすると、断片化が発生します。割り当てたメモリのチャンク間にギャップがないことを確認するためにOSが実行できることは非常に限られています。しかし、一般的に、これに起因するメモリ使用量は頭打ちになります。

プログラムのメモリが継続的に増加している場合は、メモリリークが発生しています。オブジェクトを忘れている(またはCスタイルの割り当ての場合はdelete呼び出す)か、オブジェクトをコンテナに蓄積して削除するのを忘れています。free()

delete行方不明の通話を見つけるには、 valgrindを使用してください!

valgrindを使用してメモリリークを検出するのは、お気に入りのパッケージマネージャーを使用してインストールしてから実行するのと同じくらい簡単です。

valgrind my_program

プログラムが実行され、プログラムが終了すると、valgrindは、完全なスタックトレースを含む、メモリリークとその発生元に関する非常に詳細なレポートをダンプします。

valgrindは素晴らしいです。

于 2012-04-27T01:59:31.910 に答える
0

map :: Erase()はオブジェクトのデストラクタメソッドを呼び出すため、メモリリークが発生しないようにする必要があります

おそらく、使用されたメモリがどれだけ増加したか、およびデータ構造のサイズを測定できれば、問題がどこにあるかについての良いヒントが得られます。

20分ごとに約600.000件のメッセージが届きます。メモリ使用量が1GBから2GBに倍増すると、メッセージあたり1.8kBの損失が発生します(20分で1GB / 600.000メッセージ)

于 2012-04-29T20:46:04.403 に答える
0

ええと、メモリ使用量の増加は、単なるリーク以上のものを意味します。

RSS(レジデントサイズ)は増えていますか?または、VSZ(仮想サイズ)は増加していますか?

「ps-aux」を実行するとわかります

私が経験したことは、RSSが同じままで、VSZが増え続ける場合、それは確かにメモリリークです。

RSSが成長し続け、ある時点でVSZが安定する場合は、毎回大量のメモリにアクセスしているだけでなく、アクセスしているメモリの量も増えているため、コードでこれを見つけるのは困難です。

于 2018-02-01T23:57:18.363 に答える